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.


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 .


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? ".


371

Sie können auch diesen einfachen Weg ausprobieren:

git show <COMMIT>

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.


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.


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

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.


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.


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?


16

Andere Möglichkeit:

git log -p COMMIT -1

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.


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


9

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

git diff <commit-hash>^-

Beispiel:

git diff cd1b3f485^-

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 <you@you.com>
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


"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.


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

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 <souparno.majumder@gmail.com>
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 <souparno.majumder@gmail.com>
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

2

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


1

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

$gitk (Mention your commit id here)

zum Beispiel:

$gitk HEAD~1 

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.