Существуют ли подводные камни при фиксации переименования файлов в одиночку, чтобы сохранить историю?
На этом сайте есть много вопросов относительно поведения git mv
и как получить историю файла через границы имени. Я понимаю, что Git на самом деле не записывает перемещение / переименование файла, но я не совсем понимаю, в чем проблема с этим вручную.
Предположим, я хочу переименовать файл, и я хочу сохранить его историю вместе. Если мой рабочий процесс что-то вроде
git mv file.txt new_file.txt
<make substantial changes to new_file.txt>
git add new_file.txt
git commit -m "rename and change"
тогда история будет сломана. Выход из git log --follow -- new_file.txt
будет просто последним коммитом "переименовать и изменить".
Однако, если я вместо этого использую рабочий процесс, как
git mv file.txt new_file.txt
git commit -m "rename"
<make substantial changes to new_file.txt>
git add new_file.txt
git commit -m "change"
тогда кажется, что я предотвратил разрыв. Вывод той же команды log теперь дает мне "change", "rename" и любые коммиты, которые file.txt
был вовлечен в до этого.
Я понимаю, что это излишне, если файл по существу не редактируется, так как в этом случае Git будет выводить переименование самостоятельно. Но с точки зрения реальных неприятных проблем, наиболее вероятная, о которой я мог подумать, - это какой-то конфликт слияния, и я не смог найти ситуацию, которая идет хуже, чем обычные действия.
Мой вопрос: я что-то упустил? Есть ли опасность где-то скрываться в совершении явного коммита переименования, подобного этому?
1 ответ
Ничего не делается хуже, делая это. В настоящее время ничто не улучшается, но если я когда-нибудь обойдусь с этим, и если мои изменения в Git будут приняты, это может фактически сделать git merge
работать лучше в некоторых случаях (возможно, с аргументом флага git merge
) в будущем. Возможно когда-нибудь.
(В частности, git merge
в настоящее время просто делает git diff <base> <tip>
для каждого из двух советов, не глядя ни на какие коммиты между ними. Мне кажется, что было бы хорошо, если бы было выполнено быстрое сканирование пути предков для коммитов, которые переименовывают файлы, и собирает все эти переименования для окончательных различий между базами данных. Чтобы сделать это сканирование приемлемо быстрым, необходимо проверить только точные переименования, а не приблизительные; поэтому добавление коммита, который выполняет переименование, но ничего больше, позволило бы этому дополнительному проходу слияния, если он вообще был добавлен, найти переименование при больших изменениях кода.)
(Не совсем понятно, что это добавляет много, если вообще имеет значение, так как переименование через большой промежуток, когда Git не может обнаружить переименование, может не иметь никакого значения для выполнения слияния.)