Как сделать git diff на перемещенный/переименованный файл?

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

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

Ответ 1

Вам нужно использовать -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.

Ответ 2

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

git diff HEAD:./oldfilename newfilename

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

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

git diff HEAD:path/to/oldfilename newfilename

Ответ 3

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

Смотрите commit 5404c11, совершить 9501d19, совершить a9276a6, совершить f07fc9e, совершить 62df1e6 (25 февраля 2016 г.) Matthieu Moy (moy).
(слияние Junio ​​C Hamano - gitster - в совершить 5d2a30d, 03 апреля 2016)

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

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

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

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

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

Ответ 4

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

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

НТН

Ответ 5

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