514 Stimmen

Wie man eine Übertragung mit der übergeordneten Übertragung vergleicht

Gibt es, abgesehen vom Schreiben eines Alias oder Skripts, einen kürzeren Befehl, um das Diff für einen bestimmten Commit zu erhalten?

git diff 15dc8^..15dc8

Wenn Sie nur die einzelne Commit-ID angeben git diff 15dc8 wird dieser Commit gegen HEAD abgeglichen.

0 Stimmen

Das Coolste daran wäre, dass dies mit "git difftool" funktionieren würde, indem man die Werkzeuge verwendet, um den Unterschied anzuzeigen.

0 Stimmen

Die Antwort auf die andere Frage zeigt, wie Sie einen Bash-basierten Alias einrichten können, um die obigen Schritte zu vereinfachen: stackoverflow.com/questions/3321492/

697voto

mipadi Punkte 377834

Utilice git show $COMMIT . Es zeigt Ihnen die Logmeldung für den Commit und den Diff dieses bestimmten Commits.

48 Stimmen

Schade, dass es nicht difftool benutzen kann :(

1 Stimmen

@orip Sie können GIT_EXTERNAL_DIFF immer auf ein Skript setzen, das das Gleiche tut wie Ihr Difftool.

7 Stimmen

Ich bevorzuge JakubNarebskis Antwort, da der dort angegebene Commit-Ausdruck in vielen Kontexten funktionieren wird: stackoverflow.com/a/449128/992887

500voto

Jakub Narębski Punkte 286531

Verwendung:

git diff 15dc8^!

wie in dem folgenden Fragment von git-rev-parse(1) man-Seite (oder in modernem Git gitrevisions(7) Manpage):

Zwei weitere Abkürzungen für die Benennung einer Menge, die aus einer Übergabe und ihrer Eltern-Commits besteht. Die Schreibweise r1^@ steht für alle Eltern von r1. r1^! schließt Commit r1 ein, schließt aber alle seine Eltern aus.

Dies bedeutet, dass Sie Folgendes verwenden können 15dc8^! als Abkürzung für 15dc8^..15dc8 überall in Git, wo Revisionen erforderlich sind. Für die diff Befehl, der git diff 15dc8^..15dc8 wird verstanden als git diff 15dc8^ 15dc8 , d.h. die Differenz zwischen dem Elternteil der Übergabe ( 15dc8^ ) und festlegen ( 15dc8 ).

Nota : die Beschreibung in git-rev-parse(1) Manpage spricht über Revision Bereiche , wo es auch für Merge-Commits mit mehr als einem Parent funktionieren muss. Dann r1^! ist " r1 --not r1^@ " d.h. " r1 ^r1^1 ^r1^2 ... "


Sie können auch Folgendes verwenden git show COMMIT um die Commit-Beschreibung und den Diff für einen Commit zu erhalten. Wenn Sie nur den Diff benötigen, können Sie git diff-tree -p COMMIT .

9 Stimmen

Dies sollte die akzeptierte Antwort sein, sie ist viel übersichtlicher. Allerdings ist der letzte Satz des git-rev-parse-Auszugs ziemlich verwirrend - es scheint, als ob er "Bereich von der übergeordneten Version dieses Commits bis zu diesem Commit" bedeutet.

3 Stimmen

@RichVel: Es ist ein bisschen verwirrend, weil es versucht, auch die Situation zu beschreiben, in der ein Commit mehr als einen Elternteil hat (ein Merge-Commit ist). r1^! funktioniert auch dann wie erwartet.

1 Stimmen

@JakubNarebski: Guter Punkt, vielleicht könnten Sie Ihre Antwort dahingehend ändern, dass Sie Ihr Verständnis der Fälle von Alleinerziehenden und mehreren Elternteilen zusammenfassen - getrennte Aussagen zu jedem Fall wären vielleicht leichter zu verstehen.

60voto

Wenn Sie wissen, wie weit Sie zurückliegen, können Sie etwas wie folgt versuchen:

# Current branch vs. parent
git diff HEAD^ HEAD

# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2

Frühere Übertragungen funktionieren in etwa so:

# Parent of HEAD
git show HEAD^1

# Grandparent
git show HEAD^2

Es gibt viele Möglichkeiten, wie Sie Commits angeben können:

# Great grandparent
git show HEAD~3

Ver diese Seite für Details .

6 Stimmen

KOPF^2 ist nicht das Großelternteil, wenn KOPF^1 Papa ist, dann ist KOPF^2 Mama. Verwenden Sie HEAD~2 für Papas Papa.

12voto

Øystein Steimler Punkte 1479

として mipadi weist darauf hin können Sie verwenden git show $COMMIT aber dies zeigt auch einige Kopfzeilen und die Übergabemeldung. Wenn Sie einen direkten Vergleich wollen, verwenden Sie git show --pretty=format:%b $COMMIT .

Das ist natürlich nicht gerade eine kurze Hand, also behalte ich diesen Alias in meiner .gitconfig

    [alias]
      sd = show --pretty=format:%b

Dies ermöglicht mir die Verwendung von git sd $COMMIT zu Diff anzeigen .

1 Stimmen

Dieser Alias kann --color enthalten, was die Lesbarkeit erleichtert: sd = show --color --pretty=format:%b

0 Stimmen

@RichVel In der Tat! Sehr guter Punkt. Wenn Sie Farben standardmäßig in Git aktiviert haben, brauchen Sie diesen Schalter allerdings nicht. Das ist, was ich normalerweise tun.

6voto

Ville Punkte 3790

Viele der genannten Beispiele (z.B. git diff 15dc8^! , oder git diff 15dc8^..15dc8 ) funktionieren nicht, wenn Sie die Z-Muschel und haben extendedglob Option eingestellt. Sie können dies auf eine der folgenden drei Arten beheben:

  1. unsetopt extendedglob (und/oder entfernen Sie es aus .zshrc)

  2. setopt NO_NOMATCH (und/oder setzen Sie ihn in .zshrc)

  3. das Caret und den Bang jedes Mal mit einem Backslash zu umgehen, z.B., git diff 15dc8\^\!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X