2010-03-11 6 views
90

Wenn ich "git pull" starte, möchte ich oft wissen, was sich zwischen der letzten Version einer Datei und der neuen geändert hat. Angenommen, ich möchte wissen, was jemand anderes für eine bestimmte Datei festgelegt hat.git: Wie man geänderte Dateien gegen vorherige Versionen nach einem Ziehen unterscheidet?

Wie wird das gemacht?

Ich nehme an, es ist "git diff" mit einigen Parametern für commit x im Gegensatz zu commit y, aber ich kann nicht scheinen, um die Syntax zu bekommen. Ich finde auch "git log" etwas verwirrend und bin mir nicht sicher, wo ich die Commit-ID meiner letzten Version der Datei im Vergleich zu der neuen erhalten soll.

+1

Sie könnten das Grafik-Tool gitk mehr nach Ihrem Geschmack finden. – crazyscot

+0

http://stackoverflow.com/questions/61002/how-can-i-generate-a-git-diff-of-whats-changed-since-the-last-time-i-pulled könnte diesem ähnlich sein – VonC

Antwort

124

Es gibt alle Arten von wunderbaren Möglichkeiten, um Commits zu spezifizieren - siehe die Sektion von man git-rev-parse für weitere Details. In diesem Fall möchten Sie wahrscheinlich:

git diff [email protected]{1} 

Die @{1} Mittel „um die vorherige Position des ref I angegeben haben“, so dass ausgewertet wird, was Sie zuvor ausgecheckt hatten - kurz vor dem Zug. Sie können HEAD am Ende dort heften, wenn Sie auch einige Änderungen in Ihrem Arbeitsbaum haben und Sie die diffs für sie nicht sehen möchten.

Ich bin nicht sicher, was Sie fragen mit "die Commit-ID meiner neuesten Version der Datei" - die Commit "ID" (SHA1-Hash) ist das 40-stellige Hex rechts oben an jedem Eintrag in der Ausgabe von git log. Es ist der Hash für das gesamte Commit, nicht für eine bestimmte Datei. Es ist nicht wirklich immer mehr brauchen - wenn Sie nur eine Datei über das Pull diff wollen, tun

git diff [email protected]{1} filename 

Dies ist eine allgemeine Sache ist - wenn man über den Zustand einer Datei in einem bestimmten wissen wollen, verpflichten , geben Sie das Commit und die Datei an, keine für die Datei spezifische ID/Hash.

+0

Der von VonC verlinkte vorherige Beitrag sagt im Wesentlichen das Gleiche, aber die Erklärung ist ein bisschen anders, also werde ich das jetzt lassen. (Es verwendet auch '@ {1}' als Kurzschrift für 'HEAD @ {1}') – Cascabel

+0

true, aber ich mag auch die Erklärung. +1 – VonC

+0

Dies ist genau das, was ich gesucht habe. Danke für die Erklärung. – lucapette

11

Wenn Sie eine gerade git pull tun, dann werden Sie entweder "schnell weitergeleitet" oder eine unbekannte Anzahl von Commits aus dem Remote-Repository zusammenführen. Dies geschieht jedoch nur als eine Aktion, so dass der letzte Commit, den Sie unmittelbar vor dem Pull ausgeführt haben, der letzte Eintrag im Reflog ist und auf [email protected]{1} zugegriffen werden kann. Das bedeutet, dass Sie tun können:

git diff [email protected]{1} 

Allerdings würde ich dringend empfehlen, dass, wenn dies Sie etwas finden sich eine Menge tun, dann sollten Sie nur einen git fetch tun und den abgerufenen Zweig der Prüfung vor manuell Zusammenführen oder Rebasing auf es. Z.B. wenn Sie auf Master sind und würden in origin/master ziehen:

git fetch 

git log HEAD..origin/master 

# looks good, lets merge 

git merge origin/master 
+0

Schöne Verwendung von 'git log' anstelle von' git diff' hier (auch wenn die Syntax ein wenig inkohärent zwischen dem '..' für 'git log' und dem '...' für' git diff' ist;) + 1 Siehe http://stackoverflow.com/questions/53569/how-to-get-the-changes-on-a-branch-in-git/53573#53573 und http://stackoverflow.com/questions/850607/ Unterschied-in-git-log-ursprung-master-vs-git-log-ursprung-master/850695 # 850695 – VonC

+0

Zum Glück, wenn Sie die '..' Syntax in einem git diff Befehl verwenden git "tut das Richtige". –

42

Ich mag verwenden:

git diff HEAD^ 

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

git diff HEAD^ -- /foo/bar/baz.txt 
+3

-1: 'HEAD ^' ist das Eltern-Commit, nicht das Commit vor 'pull' – CharlesB

+0

Wenn' HEAD' ein Merge-Commit ist, ist 'HEAD ^' das erste Eltern-Commit, also ja, es kann das Commit vor dem sein "ziehen". Um den anderen Elternteil (für eine zweifache Zusammenführung) zu erhalten, verwenden Sie 'HEAD^2'. Aber dann beantwortet obige Antwort nicht wirklich die Frage an erster Stelle, also verlassen die -1 ;-) –

+0

Danke für die Klarstellung. Ich habe die Frage nicht sehr sorgfältig gelesen, da ich nach etwas anderem gegoogelt habe und dieser Link auf der Ergebnisseite hoch gekommen ist. Ich dachte, ich würde hineinspielen, da ich ein neuer Benutzer bin und kein Karma habe (wenn das SO heißt). Meine Schuld =) – cadizm

Verwandte Themen