Git явно не хранит ходы (и, соответственно, переименовывает).Вместо этого он всегда записывает удаление одного файла и добавление другого.Он обнаруживает движения и переименовывает, вычисляя сходство файлов, которые были удалены и добавлены.Так что отрадно то, что вам не нужно переписывать свою историю, чтобы выполнить это.
Вместо этого вам нужно указать diff или слияние для поиска переименованных файлов.В diff вы будете использовать флаг --find-renames
, а при слиянии вы будете использовать стратегию recursive
с набором find-renames
параметров .
git diff --find-renames[=<n>]
git merge -s recursive -Xfind-renames[=<n>]
Оба могут принимать необязательное значение для выражения того, какими должны быть похожие файлы.По умолчанию это 50%.Вы можете установить это, сделав <n>
сходство, которое вы ищете.Например, --find-renames=40%
, чтобы сказать, что это совпадение, если хотя бы 40% строк в файле совпадают.Будьте очень осторожны, поднимая его слишком высоко, очень легко получить ложные срабатывания.
Этот параметр обычно включен по умолчанию.Он уже включен, другая частая причина этой проблемы - массовые изменения пробелов в файлах, с которыми вы работаете (изменение конца строки, переходы на пробелы, изменение отступа), которые превышают этот порог в 50%.В этих случаях вы можете вызвать один из параметров управления пробелами (для diff и merge ), чтобы помочь, но это часто требует некоторой очистки после факта, так что вы можете захотетьдобавьте параметр --no-commit
для таких слияний, чтобы вы могли устранить любые пробелы перед фиксацией.