Jak zrobić git diff na przeniesionym/zmienionym pliku?

Przeniosłem plik używając git mv. Teraz chciałbym zrobić diff na nowym pliku, aby porównać go ze starym plikiem (ze starą, obecnie nieistniejącą nazwą).

Jak to zrobić?
Author: Randall, 2011-04-20

5 answers

Musisz użyć opcji-M, aby git automatycznie wykrył przeniesiony plik podczas różnicowania. Używanie tylko git diff, jak wspomniał knittl, nie działa dla mnie.

Więc po prostu: git diff -M powinien to zrobić.

Dokumentacja dla tego przełącznika to:

-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.
 129
Author: Zitrax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-12 09:38:17

Oprócz tego, co napisał knittl, zawsze możesz użyć:

git diff HEAD:./oldfilename newfilename

Gdzie HEAD:./oldfilename oznacza nazwę oldfilename w ostatnim zatwierdzeniu (w nagłówku), względem bieżącego katalogu.

Jeśli nie masz wystarczająco dużo nowego Gita, musisz użyć zamiast tego:

git diff HEAD:path/to/oldfilename newfilename
 66
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:25

Z git 2.9 (czerwiec 2016), nie musisz już dodawać -M. git diff domyślnie używa -M.

Zobacz commit 5404c11, / align = "left" / 9501d19, / align = "left" / a9276a6, / align = "left" / f07fc9e, commit 62df1e6 (25 Feb 2016) by Matthieu Moy (moy).
(dodany przez Junio C Hamano -- gitster -- in commit 5d2a30d, 03 Apr 2016)

diff: domyślnie Aktywuj diff.renames

Wykrywanie zmian nazw jest bardzo wygodną funkcją, a nowi użytkownicy nie powinni trzeba grzebać w dokumentacji, aby z niej skorzystać.

Potencjalne zastrzeżenia do aktywacji wykrywania zmiany nazwy są takie, że czasami zawodzą, a czasami są powolne. Ale zmiana nazwy jest już aktywowane domyślnie w kilku przypadkach, takich jak "git status " i " git merge", więc aktywacja diff.renames nie zmienia zasadniczo sytuacja. Gdy wykrywanie zmiany nazwy nie powiedzie się, teraz zawiedzie konsekwentnie between " git diff" i " git status".

To ustawienie nie wpływa na polecenia instalacyjne, stąd dobrze napisane skrypty nie będą miały wpływu.

Nowe testy tej funkcji są tutaj .

 16
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-05 19:36:44

Z jakiegokolwiek powodu użycie HEAD:./oldfilename (lub ścieżki absolutnej) nie zadziałało dla mnie, ale HEAD:oldfilename zadziałało (dzięki cmn):

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

HTH

 1
Author: Oli Studholme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-26 04:34:07

Po prostu uruchom git diff bez żadnych argumentów, lub git diff -- newfilename. git jest wystarczająco inteligentny, aby porównać odpowiednie pliki / zawartość (tj. oryginalną zawartość przed zmianą nazwy ze zmienioną zawartością po zmianie nazwy)

 -3
Author: knittl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-20 13:04:20