git: Wie kann man geänderte Dateien nach einem Pull von früheren Versionen unterscheiden?

115

Wenn ich "git pull" ausführe, möchte ich oft wissen, was sich zwischen der letzten und der neuen Version einer Datei geändert hat. Angenommen, ich möchte wissen, was jemand anderes für eine bestimmte Datei festgelegt hat.

Wie geht das?

Ich gehe davon aus, dass es "git diff" mit einigen Parametern für Commit x und Commit y ist, aber ich kann die Syntax anscheinend nicht verstehen. Ich finde "git log" auch etwas verwirrend und bin mir nicht sicher, wo ich die Commit-ID meiner neuesten Version der Datei im Vergleich zur neuen bekommen soll.

Doug
quelle
1
Möglicherweise finden Sie das gitk-Grafiktool besser für Ihren Geschmack.
Crazyscot
stackoverflow.com/questions/61002/… könnte diesem ähnlich sein
VonC

Antworten:

157

Es gibt viele wunderbare Möglichkeiten, Commits anzugeben.man git-rev-parse Weitere Informationen finden Sie im Abschnitt zum Festlegen von Revisionen unter . In diesem Fall möchten Sie wahrscheinlich:

git diff HEAD@{1}

Das @{1}bedeutet "die vorherige Position des Schiedsrichters, die ich angegeben habe", sodass ausgewertet wird, was Sie zuvor ausgecheckt haben - kurz vor dem Ziehen. Sie können dort HEADam Ende anheften, wenn Sie auch einige Änderungen in Ihrem Arbeitsbaum haben und die Unterschiede für sie nicht sehen möchten.

Ich bin mir nicht sicher, wonach Sie mit "der Festschreibungs-ID meiner neuesten Version der Datei" fragen - die Festschreibungs-ID (SHA1-Hash) ist das 40-stellige Hex direkt oben in jedem Eintrag in der Ausgabe von Git Log. Es ist der Hash für das gesamte Commit, nicht für eine bestimmte Datei. Sie brauchen nie wirklich mehr - wenn Sie nur eine Datei über den Pull verteilen möchten, tun Sie dies

git diff HEAD@{1} filename

Dies ist eine allgemeine Sache. Wenn Sie den Status einer Datei in einem bestimmten Commit kennen möchten, geben Sie das Commit und die Datei an, nicht eine für die Datei spezifische ID / einen Hash.

Cascabel
quelle
VonCs verlinkter vorheriger Beitrag sagt im Wesentlichen dasselbe wie das, aber die Erklärung ist etwas anders, also lasse ich dies vorerst. (Es wird auch @{1}als Abkürzung für verwendet HEAD@{1})
Cascabel
stimmt, aber ich mag auch die Erklärung. +1
VonC
Genau das habe ich gesucht. Danke für die Erklärung.
Lucapette
+1 für das, was ich gegoogelt habe. Wäre fantastisch, wenn dies als Antwort ausgewählt und nach oben gestoßen würde ... :)
Longda
@longda Wenn Sie nach Stimmen sortieren (was ich für Standard hielt), sollte es bereits oben sein.
Cascabel
57

Ich benutze gerne:

git diff HEAD^

Oder wenn ich nur eine bestimmte Datei unterscheiden möchte:

git diff HEAD^ -- /foo/bar/baz.txt
Cadizm
quelle
5
-1: HEAD^ist das übergeordnete Commit, nicht das Commit vorpull
CharlesB
1
Wenn HEADes sich um ein Merge-Commit handelt, HEAD^handelt es sich um das erste übergeordnete Commit. Ja, es kann also das Commit vor dem sein pull. Verwenden Sie, um das andere übergeordnete Element (für eine bidirektionale Zusammenführung) abzurufen HEAD^2. Aber dann, obige Antwort ist nicht wirklich die Frage zu beantworten, so verlassen Sie die -1 ;-)
Michael Wild
Danke für die Klarstellung. Ich habe die Frage nicht sehr sorgfältig gelesen, da ich nach etwas anderem gegoogelt habe und dieser Link ganz oben auf der Ergebnisseite auftauchte. Ich dachte, ich würde mich einschalten, da ich ein neuer Benutzer bin und kein Karma habe (wenn es so heißt, SO). Meine Schuld =)
Cadizm
3
@ MichaelWild es war vielleicht nicht das, was der Fragesteller fragte, aber es war das, wonach ich suchte, als ich das fand. Es war nützlich für mich. Upvoting.
John Dvorak
Dies ist, was TortoiseGit "Diff mit vorheriger Version" tut. Und danach habe ich gesucht.
Fabien Haddadi
15

Wenn Sie einen Straight git pullausführen, werden Sie entweder schnell weitergeleitet oder führen eine unbekannte Anzahl von Commits aus dem Remote-Repository zusammen. Dies geschieht jedoch als eine Aktion. Das letzte Commit, an dem Sie unmittelbar vor dem Pull teilgenommen haben, ist der letzte Eintrag im Reflog und kann als abgerufen werden HEAD@{1}. Dies bedeutet, dass Sie Folgendes tun können:

git diff HEAD@{1}

Ich würde jedoch dringend empfehlen, dass Sie, wenn dies etwas ist, das Sie häufig tun, in Betracht ziehen sollten, nur einen zu tun git fetchund den abgerufenen Zweig zu untersuchen, bevor Sie ihn manuell zusammenführen oder neu aufbauen. ZB wenn du auf Master bist und Origin / Master ziehen wolltest:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master
CB Bailey
quelle
Gute Verwendung von git logstatt git diffhier (auch wenn die Syntax zwischen '..' für git logund '...' für git diff;) etwas inkohärent ist ;) +1 Siehe stackoverflow.com/questions/53569/… und stackoverflow.com/questions / 850607 /…
VonC
Glücklicherweise macht git "das Richtige", wenn Sie die Syntax '..' in einem git diff-Befehl verwenden.
CB Bailey