моя компания недавно начала использовать Git для контроля версий исходного кода, и из-за некомпетентности кодеров - это я и мой босс :-P - у нас есть действительно хорошие спагетти файлов, которые перезаписываются тут и там.
Есть ли способ пометить определенные файлы как «неприкосновенные», чтобы при обновлении ветки из другой файлы не перезаписывались или не выполнялись обновления вообще?
Заранее спасибо.
В общем, 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/*
Доработать по вкусу.
Вы можете делать именно то, о чем просите, с помощью хуков, но я не знаю, решит ли это вашу настоящую проблему.
Если это так же просто, как изменение ваших незавершенных файлов, это просто: никогда не вытягивайте / не объединяйте / не перемещайте незафиксированные изменения. Всегда делайте коммит, прежде чем вводить любой другой код.