webentwicklung-frage-antwort-db.com.de

Wie mache ich ein Git Diff auf verschobene / umbenannte Datei?

Ich habe eine Datei mit git mv Verschoben. Jetzt möchte ich die neue Datei einem Diff unterziehen, um sie mit der alten Datei zu vergleichen (mit dem alten, jetzt nicht mehr existierenden Namen).

Wie mache ich das?

118
dr jerry

Sie müssen -M verwenden, damit Git die verschobene Datei beim Vergleichen automatisch erkennt. Mit nur git diff wie von knittl erwähnt geht bei mir nicht.

Also einfach: git diff -M Sollte es tun.

Die Dokumentation für diesen Schalter lautet:

-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.
138
Zitrax

Zusätzlich zu dem, was knittl schrieb , können Sie immer Folgendes verwenden:

git diff HEAD:./oldfilename newfilename

wo HEAD:./oldfilename bedeutet alter Dateiname im letzten Festschreiben (in HEAD), relativ zum aktuellen Verzeichnis.

Wenn Sie nicht genug Git haben, müssen Sie stattdessen Folgendes verwenden:

git diff HEAD:path/to/oldfilename newfilename
75
Jakub Narębski

Mit git 2.9 (Juni 2016) müssen Sie nicht mehr -M Hinzufügen. git diff verwendet standardmäßig -M.

Siehe Festschreiben 5404c11 , Festschreiben 9501d19 , Festschreiben a9276a6 , Festschreiben f07fc9e , Festschreiben 62df1e6 (25. Februar 2016) von Matthieu Moy (moy) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Commit 5d2a30d , 3. April 2016)

diff: Standardmäßig diff.renames aktivieren

Die Erkennung des Umbenennens ist eine sehr praktische Funktion, und neue Benutzer sollten nicht in der Dokumentation stöbern müssen, um davon zu profitieren.

Mögliche Einwände gegen die Aktivierung der Umbenennungserkennung sind, dass sie manchmal fehlschlägt und manchmal langsam ist. In einigen Fällen wie "git status" Und "git merge" Ist die Umbenennungserkennung jedoch bereits standardmäßig aktiviert, sodass die Aktivierung von diff.renames Die Situation nicht grundlegend ändert. Wenn die Umbenennungserkennung fehlschlägt, schlägt sie jetzt konsistent zwischen "git diff" Und "git status" Fehl.

Diese Einstellung wirkt sich nicht auf Installationsbefehle aus, daher sind gut geschriebene Skripte nicht betroffen.

Die neuen Tests für diese Funktion sind hier .

18
VonC

git diff -M aktiviert die Erkennung von Umbenennungen, wie andere gesagt haben (und wie @VonC hervorhob, ist sie ab Git 2.9 standardmäßig aktiviert). Wenn Sie jedoch über einen großen Änderungssatz verfügen, wird die ungenaue Erkennung von Umbenennungen möglicherweise immer noch deaktiviert. Git zeigt eine Warnung wie die folgende an, die im angezeigten Diff leicht zu übersehen ist:

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.

In diesem Fall stellen Sie die Konfigurationsoption wie von git vorgeschlagen ein

git config diff.renamelimit 450

und führen Sie Ihren diff-Befehl erneut aus.

1
mindriot

Aus welchem ​​Grund auch immer mit HEAD:./oldfilename (oder absoluter Pfad) hat bei mir nicht funktioniert, aber HEAD:oldfilename tat (danke cmn):

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

HTH

1
Oli Studholme