it-swarm.com.de

git diff umbenannte Datei

Ich habe eine Datei a.txt.

cat a.txt
> hello

Der Inhalt von a.txt ist "Hallo".

Ich mache ein Commit.

git add a.txt
git commit -m "first commit"

Ich verschiebe dann a.txt in ein test dir.

mkdir test
mv a.txt test

Ich mache dann mein zweites Commit.

git add -A
git commit -m "second commit"

Zum Schluss bearbeite ich a.txt und sage stattdessen "Auf Wiedersehen".

cat a.txt
> goodbye

Ich mache mein letztes Commit.

git add a.txt
git commit -m "final commit"

Hier ist meine Frage:

Wie differenziere ich den Inhalt von a.txt zwischen meinem letzten Commit und meinem ersten Commit? 

Ich habe es versucht: git diff HEAD^^..HEAD -M a.txt, aber das hat nicht funktioniert. git log --follow a.txt erkennt die Umbenennung ordnungsgemäß, aber ich kann keine Entsprechung für git diff finden. Ist dort eines?

95
Ken Hirakawa

Das Problem mit dem Unterschied zwischen HEAD^^ und HEAD ist, dass Sie in beiden Commits einen a.txt haben. Wenn Sie also nur diese beiden Commits betrachten (was diff macht), gibt es keine Umbenennung, es gibt eine Kopie und eine Änderung.

Zum Erkennen von Kopien können Sie -C verwenden:

git diff -C HEAD^^ HEAD

Ergebnis:

index ce01362..dd7e1c6 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-hello
+goodbye
diff --git a/a.txt b/test/a.txt
similarity index 100%
copy from a.txt
copy to test/a.txt

Übrigens, wenn Sie Ihr diff auf nur einen Pfad beschränken (wie in git diff HEAD^^ HEAD a.txt), werden Sie niemals die Umbenennungen oder Kopien sehen, da Sie alles außer einem einzigen Pfad ausgeschlossen haben und Umbenennungen oder Kopien (per Definition) beinhalten zwei wege.

103
CB Bailey

Um über eine Umbenennung einer bestimmten Datei hinweg zu unterscheiden, verwenden Sie -M -- <old-path> <new-path> (-C funktioniert auch).

Wenn Sie also beim letzten Commit und eine Datei umbenannt haben, können Sie die Änderungen wie folgt sehen:

git diff HEAD^ HEAD -M -- a.txt test/a.txt

Dies erzeugt:

diff --git a/a.txt b/test/a.txt
similarity index 55%
rename from a.txt
rename to test/a.txt
index 3f855b5..949dd15 100644
--- a/a.txt
+++ b/test/a.txt
@@ -1,3 +1,3 @@
 // a.txt

-hello
+goodbye

(// a.txt Zeilen hinzugefügt, damit git die Umbenennung erkennen kann)


Wenn git die Umbenennung nicht erkennt, können Sie mit einen niedrigen Ähnlichkeitsschwellenwert mit -M[=n] angeben, beispielsweise 1%:

git diff HEAD^ HEAD -M01 -- a.txt test/a.txt

Von dem git diff docs :

-M [<n>] --find-umbenennt [= <n>]

Umbenennen erkennen Wenn n angegeben ist, ist dies ein Schwellenwert für den Ähnlichkeitsindex (d. H. Die Menge an Additionen/Löschungen Im Vergleich zur Dateigröße). Zum Beispiel bedeutet -M90%, dass Git Betrachten Sie ein Delete/Add-Paar als Umbenennung, wenn mehr als 90% der Datei hat sich nicht verändert Ohne ein %-Zeichen ist die Nummer als .__ zu lesen. Bruch mit einem Dezimalpunkt vor. Das heißt, -M5 wird 0,5 und ist also das Gleiche wie -M50%. Ähnlich ist -M05 dasselbe wie -M5%. Zu Beschränken Sie die Erkennung auf genaue Umbenennungen, verwenden Sie -M100%. Die Standardähnlichkeit Index beträgt 50%.

71
Nolan Amy

Sie können auch tun:

git diff rev1:file1 rev2:file2

was für dein Beispiel wäre

git diff HEAD^^:./a.txt HEAD:./test/a.txt

Beachten Sie den expliziten ./ - dieses Format setzt andernfalls voraus, dass die Pfade relativ zum Stamm des Repos sind. (Wenn Sie sich in der Wurzel des Repos befinden, können Sie das natürlich weglassen.)

Dies hängt nicht von der Umbenennungserkennung ab, da der Benutzer explizit genau angibt, was er vergleichen soll. (Daher ist es auch in anderen Situationen hilfreich, z. B. beim Vergleich von Dateien zwischen verschiedenen svn-Zweigen in einer git-svn-Umgebung.)

22
benkc

Wenn Ihr Umbenennungs-Commit bereitgestellt wird, aber noch nicht festgeschrieben ist, können Sie Folgendes verwenden:

git diff --cached -M -- file.txt renamed_file.txt
1
Mr-IDE