Как сделать git diff для перемещенного / переименованного файла? - PullRequest
117 голосов
/ 20 апреля 2011

Я переместил файл, используя git mv. Теперь я хотел бы сделать diff для нового файла, чтобы сравнить его со старым файлом (со старым, ныне несуществующим именем).

Как мне это сделать?

Ответы [ 6 ]

138 голосов
/ 12 апреля 2012

Вам нужно использовать -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.
74 голосов
/ 20 апреля 2011

В дополнение к тому, что knittl написал , вы всегда можете использовать:

git diff HEAD:./oldfilename newfilename

, где HEAD:./oldfilename означает oldfilename в последнем коммите (в HEAD) относительно текущего каталога.

Если у вас нет достаточно нового git, вы должны использовать вместо него:

git diff HEAD:path/to/oldfilename newfilename
19 голосов
/ 05 апреля 2016

С git 2.9 (июнь 2016 г.) вам больше не нужно добавлять -M.git diff использует -M по умолчанию.

См. commit 5404c11 , commit 9501d19 , commit a9276a6 , коммит f07fc9e , коммит 62df1e6 (25 февраля 2016 г.) от Матье Мой (moy) .
(объединено JunioC Hamano - gitster - in commit 5d2a30d , 03 апреля 2016 г.)

diff: активировать diff.renames по умолчанию

Обнаружение переименования - очень удобная функция, и новым пользователям не нужно копаться в документации, чтобы извлечь из этого пользу.

Потенциальные возражения против активации обнаружения переименования состоят в том, что иногда это происходит сбой, и этоиногда медленноНо обнаружение переименования уже активировано по умолчанию в некоторых случаях, таких как "git status" и "git merge", поэтому активация diff.renames принципиально не меняет ситуацию.Когда обнаружение переименования завершается неудачно, теперь оно постоянно происходит между "git diff" и "git status".

Этот параметр не влияет на команды слесарного дела, поэтому на хорошо написанные сценарии это не повлияет.

Новые тесты для этой функции здесь .

1 голос
/ 09 октября 2018

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

и повторите команду сравнения.

1 голос
/ 26 декабря 2011

По какой-то причине использование HEAD:./oldfilename (или абсолютный путь) у меня не сработало, но HEAD:oldfilename (спасибо cmn):

git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename

HTH

0 голосов
/ 20 апреля 2011

просто запустите git diff без аргументов или git diff -- newfilename. git достаточно умен, чтобы сравнивать нужные файлы / содержимое (т.е. исходное содержимое перед переименованием с измененным содержимым после переименования)

...