Wie sehe ich die Änderungen in einem Git-Commit?

1549

Wenn ich das tue, git diff COMMITsehe ich die Änderungen zwischen diesem Commit und HEAD (soweit ich weiß), aber ich würde gerne die Änderungen sehen, die durch dieses einzelne Commit vorgenommen wurden.

Ich habe keine offensichtlichen Optionen für diff/ gefunden log, die mir diese Ausgabe geben.

Laktak
quelle
4
Mögliches Duplikat von Shorthand für Diff of Git Commit mit seinem Elternteil?
Chris Maes

Antworten:

1975

So sehen Sie den Unterschied für einen bestimmten COMMITHash:

git diff COMMIT~ COMMITzeigt Ihnen den Unterschied zwischen dem COMMITVorfahren und dem COMMIT. In den Manpages für git diff finden Sie Details zum Befehl und zu gitrevisions zur ~Notation und ihren Freunden.

Alternativ git show COMMITwird etwas sehr ähnliches gemacht. (Die Daten des Commits, einschließlich seiner diff - aber nicht für Merge-Commits.) Siehe die Manpage zu git show .

Nevik Rehnel
quelle
17
Beachten Sie, dass die ^in den Thomson- und Bourne-Shells (Synonym für |dort) und rcihren Derivaten (Caret-Operator) und zshmit aktiviertem Extendedglob ( notGlobbing-Operator) angegebenen Angaben gemacht werden müssen
Stephane Chazelas,
3
Beachten Sie, dass HEAD^dies den ersten Elternteil impliziert, falls ein Commit mehrere Eltern hat (dh Merge-Commit).
Mansour
23
git diff COMMIT~ COMMITfunktioniert bei mir, beachte die Tilde statt Caret. Ich verwende Git Version 2.6.1.windows.1 unter Windows 10.
Juuso Ohtonen
14
@tradetree: Das Wort COMMIT soll durch den Namen eines Commits ersetzt werden, z. B. die SHA-Summe.
Nick Matteo
91
Ich denke, Git Show ist besser für diese Frage geeignet und sollte der zuerst erwähnte Vorschlag sein.
Pypmannetjies
497

Wie in " Kurzform für Diff of Git Commit mit seinem Elternteil? " Erwähnt , können Sie auch verwenden git diffmit:

git diff COMMIT^!

oder

git diff-tree -p COMMIT

Bei git show müssten Sie (um sich nur auf diff zu konzentrieren) Folgendes tun:

git show --color --pretty=format:%b $COMMIT

Der COMMITParameter ist ein Commit-ish :

Ein Festschreibungsobjekt oder ein Objekt , das rekursiv auf ein Festschreibungsobjekt dereferenziert werden kann. Im Folgenden sind alle Festschreibungszeichen aufgeführt: ein Festschreibungsobjekt, ein Tag-Objekt , das auf ein Festschreibungsobjekt verweist, ein Tag-Objekt, das auf ein Tag-Objekt verweist, das auf ein Festschreibungsobjekt verweist, usw.

Siehe gitrevision "SPECIFYING REVISIONS", um auf ein Commit-ish zu verweisen.
Siehe auch " Was bedeutet baumartig in Git? ".

VonC
quelle
371

Sie können auch diesen einfachen Weg ausprobieren:

git show <COMMIT>
Lakhan
quelle
2
Es scheint, dass dies etwas ganz anderes macht
Miserable Variable
3
Es wird nur die Festschreibungsnachricht angezeigt. Nicht der Unterschied der Codeänderungen, die für dieses Commit angewendet wurden.
k0pernikus
1
Ja tut es? Endlich in den letzten Git-Versionen ...
Davy
2
Dies sollte die aktualisierte richtige Antwort sein
Scott Skiles
1
Dies sollte die Antwort sein.
Roel
77

git show Zeigt die Änderungen an, die im letzten Commit vorgenommen wurden.

Entspricht git show HEAD.

git show HEAD~1 bringt dich zurück 1 Commit.

Adam Salma
quelle
45

Normalerweise mache ich:

git diff HEAD~1

Anzeigen der Änderungen bezüglich des letzten Commits. Wenn Sie mehr Commits haben, erhöhen Sie einfach die Zahl 1 auf die Anzahl der Commits, die Sie sehen möchten.

Alex
quelle
34

Holen Sie sich zuerst die Commit-ID mit,

git log #to list all

Oder

git log -p -1 #last one commit id

Commit-ID kopieren.

Jetzt verwenden wir zwei Methoden, um Änderungen von einem bestimmten Commit aufzulisten:

Methode 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Methode 2:

git show commit_id
For example: git show 1c6a600a
Mohideen bin Mohammed
quelle
2
Was bedeutet das ^!?
Martín Coll
2
^! ist die Abkürzung für Commit ^ .. Commit, was bedeutet, dass alle Eltern ausgeschlossen werden und der Unterschied in diesem Commit überprüft wird
Mohideen bin Mohammed
Ich bin kein Experte, aber ich habe einen Fall (mit mehreren beteiligten Zweigen), in dem git log c ^! ist nicht genau das gleiche wie git log c ^ .. c. Tatsächlich ist es viel besser: git log c ^ .. c listete zu viele Einträge auf, während git log c ^! habe das Richtige getan, also habe ich lange danach gesucht
user829755
32
git show <commit_sha>

Dies zeigt Ihnen genau, was in diesem Commit enthalten ist. Ich denke, Sie können eine Reichweite erzielen, indem Sie einfach ein Leerzeichen zwischen zwei Commit-Shas setzen.

git show <beginning_sha> <ending_sha>

Dies ist sehr hilfreich, wenn Sie häufig neu gründen, da Ihre Feature-Protokolle alle in einer Reihe angeordnet sind.

Iwnnay
quelle
25

Aus der Manpage für git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Verwenden Sie die dritte in der Mitte:

git diff [options] <parent-commit> <commit>

Ebenfalls von derselben Manpage unten im Abschnitt Beispiele :

$ git diff HEAD^ HEAD      <3>

Vergleichen Sie die Version vor dem letzten Commit und dem letzten Commit.

Zugegeben, es ist etwas verwirrend formuliert, es wäre weniger verwirrend als

Vergleichen Sie das letzte Commit mit dem vorherigen Commit.


quelle
3
Ihre Umformulierung würde gelten für git diff HEAD HEAD^.
Richard
git diff HEAD ^ HEAD zeigt keine Änderungen an.
user3690202
@ user3690202, was bedeutet, dass keine Änderungen angezeigt werden müssen. Ist das tatsächlich der Fall?
Wie können keine Änderungen angezeigt werden? Wenn Sie das letzte Commit anzeigen möchten, müssen einige Änderungen angezeigt werden, es sei denn, es handelt sich um ein vollständig neues Repository.
user3690202
@ user3690202 Es ist möglich, mit Git ein "leeres Commit" durchzuführen, das keine Änderungen gegenüber dem übergeordneten Element enthält, obwohl es einen integrierten Schutz gibt, der dies überprüft und verhindert, obwohl er mit einer Befehlszeilenoption überschrieben werden kann. Ich bezweifle, dass Sie absichtlich ein leeres Commit erstellen würden. Eine andere Möglichkeit besteht darin, dass Sie vor dem Festschreiben eine Konvertierung am Zeilenende (oder andere lustige Leerzeichen) vorgenommen haben, die Git dazu verleitet, zu glauben, dass tatsächlich keine Änderungen vorgenommen wurden. Auf welcher Plattform läuft Git?
22

Das Folgende scheint den Job zu machen; Ich benutze es, um zu zeigen, was durch eine Fusion gebracht wurde.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
MichaelMoser
quelle
Würde das auch funktionieren git log? (wegen stackoverflow.com/a/18585297/6309 )
VonC
16

Andere Möglichkeit:

git log -p COMMIT -1
John_West
quelle
1
@GrantMcLean Ja, und es ist bereits in der am höchsten bewerteten Antwort, also erwähne ich es nicht.
John_West
11

Sie können git diff HEAD HEAD^1den Unterschied mit dem übergeordneten Commit anzeigen.

Wenn Sie nur die Liste der Dateien anzeigen möchten, fügen Sie die --statOption hinzu.

Irshu
quelle
Das ist was du meinst, git diff HEAD ^ 1 HEAD
Shibir Basak
Beachten Sie, dass dies anzeigt, was Sie als entfernt hinzugefügt haben, da ein umgekehrter Vergleich durchgeführt wird. Sie sollten den diffBefehl folgendermaßen lesen : Was muss ich in der Datei ändern, um von Commit HEADzu Commit zu gelangen HEAD^1?
Brainplot
9
git difftool COMMIT^ <commit hash>

ist auch möglich, wenn Sie Ihr Difftool konfiguriert haben.

Hier erfahren Sie, wie Sie difftool konfigurieren. Oder die Handbuchseite hier

Außerdem können Sie verwenden, um git diff-tree --no-commit-id --name-only -r <commit hash>zu sehen, welche Dateien in einem Give-Commit-Hash geändert / festgeschrieben wurden

Chand Priyankara
quelle
9

Ich mag den folgenden Befehl, um ein bestimmtes Commit mit seinem letzten Commit zu vergleichen:

git diff <commit-hash>^-

Beispiel:

git diff cd1b3f485^-
starcwl
quelle
6

Um Autor und Zeit durch Festschreiben zu sehen, verwenden Sie git show COMMIT. Was zu so etwas führen wird:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <[email protected]>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Wenn Sie sehen möchten, welche Dateien geändert wurden, führen Sie Folgendes mit den Werten aus der obigen Zusammenführungszeile aus git diff --stat a2a2894 3a1ba8f.

Wenn Sie den tatsächlichen Unterschied sehen möchten, führen Sie ihn aus git --stat a2a2894 3a1ba8f

Nikita G.
quelle
"Wenn Sie den tatsächlichen Unterschied sehen möchten, führen Sie git --stat a2a2894 3a1ba8f". Ich denke du meinst git diff a2a2894 3a1ba8foder sonst unknown option: --stat.
Obst
5

So überprüfen Sie vollständige Änderungen:

  git diff <commit_Id_1> <commit_Id_2>

Zum Überprüfen nur der geänderten / hinzugefügten / gelöschten Dateien:

  git diff <commit_Id_1> <commit_Id_2> --name-only

ANMERKUNG : Um diff ohne Commit dazwischen zu überprüfen, müssen Sie die Commit-IDs nicht eingeben.

bit_cracker007
quelle
4

Ich verwende Git Version 2.6.1.windows.1 unter Windows 10, daher musste ich eine leichte Änderung an Neviks Antwort vornehmen (Tilde statt Caret):

git diff COMMIT~ COMMIT

Eine andere Möglichkeit ist, das Caret zu zitieren:

git diff "COMMIT^" COMMIT
Juuso Ohtonen
quelle
3

Mit diesem Befehl erhalten Sie den übergeordneten Git-Commit-Hash:

git log -n 2 <commit-hash>

Nachdem git diff-tool <commit-hash> <parent-commit-hash>

Beispiel:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <[email protected]>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <[email protected]>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

Danach

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Souparno Majumder
quelle
2

Wenn Sie nur die Änderungen im letzten Commit sehen möchten, git showgeben Sie dies einfach an .

MyrionSC2
quelle
1

Wenn Sie die Quellenänderung in einer grafischen Ansicht überprüfen,

$gitk (Mention your commit id here)

zum Beispiel:

$gitk HEAD~1 
user272390
quelle
Ich verstehe nicht, warum diese Antwort abgelehnt wurde. Ich bin damit einverstanden, dass Kommandozeilen- und textbasiertes Material der richtige Weg ist, aber gitk bietet viele nützliche Informationen.
ShellFish