Предотвращение перезаписи файла с помощью Git

моя компания недавно начала использовать Git для контроля версий исходного кода, и из-за некомпетентности кодеров - это я и мой босс :-P - у нас есть действительно хорошие спагетти файлов, которые перезаписываются тут и там. Есть ли способ пометить определенные файлы как «неприкосновенные», чтобы при обновлении ветки из другой файлы не перезаписывались или не выполнялись обновления вообще?
Заранее спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 465
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

В общем, Git пытается избежать перезаписи измененных файлов при использовании проверки для перехода от ветки к ветке. То есть, если файл не был изменен и Git необходимо изменить его, файл изменится (предыдущее содержимое файла все еще существует в предыдущей ветке). Если файл был изменен и Git действительно нет должен изменить его, содержимое файла будет сохранено. Если файл был изменен и Git хочет его изменить, вы получите уведомление о том, что локальные изменения конфликтуют с изменением ветки, и Git откажется переключать ветки.

Чтобы понять, почему ваши файлы были неожиданно перезаписаны, нам, вероятно, потребуется дополнительная информация о том, что вы сделали.

Похоже, вы хотите, чтобы git не отслеживал «неприкасаемые» файлы. Это делается с помощью команда git rm.

git rm <file>

Если это то, что вы хотите, используйте переключатель --dry-run для предварительного просмотра того, что произойдет. Если вы уверены, что хотите удалить файлы, вы можете использовать переключатель --cached, чтобы локальные файлы не удалялись.

Конечно, вам придется вручную добавлять файлы в будущие ветки, что, вероятно, не является хорошей идеей.

Чтобы заставить Git выбросить информацию, требуются очень конкретные действия, но даже в этом случае он не перезаписывает информацию. Так что ситуация может быть не такой, как вы думаете.

Думайте о репозитории Git как о транзакционной базе данных вашего исходного кода. В зависимости от вашей операционной системы и настроек это может быть скрытая база данных, поэтому все, что вы видите, - это рабочий каталог.

Дело в том, что Git использует этот рабочий каталог в вашей локальной файловой системе в качестве браузера. в базе. Это «представление» может измениться, и запись всех ваших транзакций (коммитов) будет все еще в репо, без изменений.

Таким образом, рабочий каталог, который вы видите, будет меняться в зависимости от того, какое «представление» (оформление заказа, обычно ветка) вы вызвали. Даже копии файлов, открытые в вашем текстовом редакторе, могут измениться, что меня очень удивило, когда я впервые заметил это.

Вы может выбрасываете предыдущую работу, например:
1. git reset HEAD~2, который отбрасывает последние два коммита или
2. checkout -f, который отбрасывает незавершенные изменения в вашем рабочем каталоге (безвозвратно, если они не были записаны в git add) перед переходом на другую ветку ("просмотр")
но вы не можете случайно перезаписать информацию, не получив хотя бы предупреждающего сообщения. В большинстве случаев информация остается в репо до тех пор, пока она не будет собрана мусором, обычно по прошествии более 30 дней.

Как сказал Грег, нам понадобится дополнительная информация, чтобы знать наверняка.

Вы можете добавить файл с именем .gitignore. Любое имя файла, которое соответствует регулярному выражению в этом файле, будет игнорироваться git.

Итак, я обычно начинаю с чего-то вроде:

*.log
*~
conf/*

Доработать по вкусу.

Ответ принят как подходящий

Вы можете делать именно то, о чем просите, с помощью хуков, но я не знаю, решит ли это вашу настоящую проблему.

Если это так же просто, как изменение ваших незавершенных файлов, это просто: никогда не вытягивайте / не объединяйте / не перемещайте незафиксированные изменения. Всегда делайте коммит, прежде чем вводить любой другой код.

Другие вопросы по теме