Я переместил файл, используя git mv
. Теперь я хотел бы провести различие в новом файле, чтобы сравнить его со старым файлом (со старым, а теперь несуществующим именем).
Как мне это сделать?
Я переместил файл, используя git mv
. Теперь я хотел бы провести различие в новом файле, чтобы сравнить его со старым файлом (со старым, а теперь несуществующим именем).
Как мне это сделать?
Ответы:
Вам нужно использовать -M, чтобы git автоматически определял перемещенный файл при сравнении. Использование только git diff
упомянутого knittl для меня не работает.
Так просто: git diff -M
должен это сделать.
Документация для этого переключателя:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
~/.gitconfig
?
git diff
. Запуск git diff -M
одного (переименованного) файла не сообщает о переименовании.
git log --follow -- file_after_move.txt
работает хорошо. Показывает всю историю, в том числе до переезда. Любые идеи? Я бегу git version 2.11.0.windows.1
.
-C
Вариант для обнаружения копий является полезным и подобным. Я использовал его -M
для просмотра различий, в котором я реорганизовал один файл в два (ни одно имя не соответствовало оригиналу).
Помимо того, что написал knittl , вы всегда можете использовать:
git diff HEAD:./oldfilename newfilename
где HEAD:./oldfilename
означает старое имя файла в последней фиксации (в HEAD) относительно текущего каталога.
Если у вас недостаточно нового git, вам придется использовать вместо него:
git diff HEAD:path/to/oldfilename newfilename
git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
git diff branch:old/filen.name newfilename
cd
в каталог и не добавляете --
перед commit:path
парой. Здесь Git очень разборчив с синтаксисом.
<commit-ish>:<pathname>
Синтаксис - это идентификатор объекта, что-то в стиле Git; после того, как --
Git ожидает только имена файлов.
С git 2.9 (июнь 2016 г.) вам больше не придется добавлять -M
. git diff
использует -M
по умолчанию.
См. Коммит 5404c11 , фиксация 9501d19 , фиксация a9276a6 , фиксация f07fc9e , фиксация 62df1e6 (25 февраля 2016 г.) от Matthieu Moy ( moy
) .
(Объединено Junio C Hamano - gitster
- в фиксации 5d2a30d , 3 апреля 2016 г.)
diff
: активироватьdiff.renames
по умолчаниюОбнаружение переименования - очень удобная функция, и новым пользователям не нужно копаться в документации, чтобы извлечь из нее пользу.
Потенциальные возражения против активации обнаружения переименования заключаются в том, что оно иногда не работает, а иногда работает медленно. Но обнаружение переименования уже активировано по умолчанию в нескольких случаях, таких как "
git status
" и "git merge
", поэтому активацияdiff.renames
принципиально не меняет ситуацию. Когда обнаружение переименования терпит неудачу, теперь оно не работает последовательно между "git diff
" и "git status
".Этот параметр не влияет на команды сантехники, следовательно, на хорошо написанные скрипты это не повлияет.
git diff -M
активирует обнаружение переименования, как говорили другие (и, как указал @VonC, он активируется по умолчанию из git 2.9). Но если у вас большой набор изменений, возможно, снова отключится неточное определение переименования. Git отобразит предупреждение, подобное приведенному ниже, которое легко пропустить среди просматриваемых различий:
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
В этом случае установите параметр конфигурации, как предлагает git, например
git config diff.renamelimit 450
и повторно запустите вашу команду diff.
По какой-то причине использование HEAD:./oldfilename
(или абсолютный путь) у меня не сработало, но сработало HEAD:oldfilename
(спасибо cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
НТН
HEAD:./oldfilename
?
просто запустить git diff
без аргументов, или git diff -- newfilename
. git достаточно умен, чтобы сравнивать правильные файлы / содержимое (т.е. исходное содержимое перед переименованием с измененным содержимым после переименования)
git mv
вставка одного файла и последующее сравнение поэтапного состояния с другой идентичной в остальном ветвью приведет к различию «все было удалено и воссоздано заново», если -M
оно не используется.
git diff -- yourRenamedFile
будет достаточно. Смотрите мой ответ ниже