Zum Inhalt springen

git diff

Beschreibung

Der Befehl git diff wird verwendet, um Änderungen zwischen Commits, dem Arbeitsbaum und dem Staging-Bereich zu vergleichen. Er nimmt zwei Eingabedatensätze und gibt die Unterschiede zwischen ihnen aus. Häufig wird er zusammen mit den Befehlen git status und git log verwendet, um den Zustand eines Git-Repositorys zu analysieren.

gitdiff

Diff-Ausgaben

Das Vergleichen kann mehrere Ausgaben haben, die unten besprochen werden.

Rohes Ausgabeformat

Werfen Sie einen Blick auf die folgenden Befehle, um ein einfaches Repository zu erstellen:

git diff

bash
mkdir test_repo
cd test_repo
touch test.txt
echo "this is a git diff test example" > test.txt
git init .
#Initialized empty Git repository in /Users/kev/code/test/.git/
git add test.txt
git commit -am "add diff test file"
#[master (root-commit) 9e2dcac] add diff test file
#1 file changed, 1 insertion(+)
#create mode 100644 test.txt

Wenn Sie möchten, dass git diff eine Ausgabe liefert, müssen Sie den Inhalt der Datei test.txt ändern, nachdem Sie sie dem erstellten Repository hinzugefügt haben. Sie können dies tun, indem Sie den folgenden Befehl ausführen:

git diff

bash
echo "this is a diff example" > test.txt

Erst jetzt können wir einen Diff anzeigen und die Ausgabe besprechen. Das Ausführen von git diff erzeugt Folgendes:

git diff

bash
diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

Diff-Eingabequellen

Unten finden Sie die Vergleichseingabe von diff. Dadurch werden a/test.txt und b/test.txt an diff übergeben.

git diff

bash
diff --git a/test.txt b/test.txt

Metadaten

Diese Zeile zeigt einige interne Git-Metadaten. Die Zahlen in dieser Ausgabe entsprechen den Hash-Identifikatoren der Git-Objektversion.

git diff

bash
index 6b0c6cf..b37e70a 100644

Symbole für Änderungen

Diese Zeilen zeigen die Symbole, die jeder Diff-Eingabequelle zugewiesen sind. Änderungen an a/test.txt werden mit --- markiert, und Änderungen an b/test.txt werden mit dem Symbol +++ markiert.

git diff

bash
--- a/test.txt
+++ b/test.txt

Diff-Blöcke

Ein Diff zeigt nicht die ganze Datei. Es zeigt nur geänderte Zeilen. Dieser geänderte Abschnitt wird als „Chunk“ bezeichnet. Der Vorteil der Chunks ist, dass sie Zeilen vor und nach den Änderungen anzeigen, sodass Sie die Änderungen besser verstehen können.

git diff

bash
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

Die erste Zeile ist die Chunk-Überschrift. Jeder Chunk wird durch eine Überschrift innerhalb von @@-Symbolen platziert. Die an der Datei vorgenommenen Änderungen werden in der Überschrift zusammengefasst.

Häufige Flags

Git bietet mehrere nützliche Flags für unterschiedliche Workflows:

  • --staged (oder --cached): Vergleicht die gestagten Änderungen im Index mit dem HEAD-Commit.
  • --stat: Zeigt eine komprimierte Zusammenfassung der geänderten Dateien statt des vollständigen Diffs.
  • --name-only: Gibt nur die Namen der geänderten Dateien aus.

Änderungen hervorheben

Sie können die folgenden 2 Werkzeuge verwenden, um Änderungen hervorzuheben, damit sie besser sichtbar sind.

git diff --color-words

Die erste Möglichkeit, Änderungen hervorzuheben, ist der spezielle Modus, den git diff anbietet: --color-words. Dabei werden hinzugefügte und entfernte Zeilen anhand von Leerzeichen in Tokens zerlegt und anschließend verglichen.

git diff

bash
git diff --color-words
diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

(Hinweis: --color-words hebt Inline-Änderungen mithilfe von Terminalfarben hervor. Im Klartext entspricht das Ausgabeformat dem Standard-Diff.)

git diff-highlight

Beim Klonen des Git-Quellcodes findet sich ein Unterverzeichnis namens contrib. Dieses Unterverzeichnis enthält Werkzeuge, die mit Git zusammenhängen. Eines dieser Werkzeuge heißt diff-highlight. Es hebt geänderte Teilwortbestandteile hervor. Beachten Sie, dass dieses Werkzeug die Standardeingabe filtert und Terminalfarbgebung sichtbar sein muss.

git diff

bash
git diff | git diff-highlight
diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

Vergleichen binärer Dateien

git diff kann nicht nur für Textdateien, sondern auch für binäre Dateien ausgeführt werden. Die Standardoption ist dabei manchmal nicht sehr nützlich.

git diff

bash
git diff
Binary files a/script.pdf and b/script.pdf differ

Git verfügt über eine Funktion, mit der Sie einen Shell-Befehl angeben können, um den Inhalt binärer Dateien vor dem Diff in Text umzuwandeln. Dafür kann jedoch etwas Einrichtung erforderlich sein. Zunächst sollten Sie einen textconv-Filter mit der Beschreibung der Umwandlung eines bestimmten Typs von Binärdatei in Text definieren. Zum Beispiel können Sie ein einfaches Dienstprogramm namens pdftohtml (über Homebrew verfügbar) verwenden, um PDF in HTML umzuwandeln. Es gibt zwei Möglichkeiten, dies einzurichten: durch Bearbeiten der Datei .git/config oder global durch Bearbeiten von .gitconfig.

git diff

bash
[diff "pdfconv"]
textconv=pdftohtml -stdout

Dann müssen Sie eine oder mehrere Dateimuster mit dem Filter pdfconv verknüpfen, was durch das Erstellen einer Datei .gitattributes im Stammverzeichnis des Repositorys erfolgen kann.

git diff

bash
*.pdf diff=pdfconv

Nach der Konfiguration führt git diff die Binärdatei zunächst über das konfigurierte Konvertierungsskript aus und vergleicht dann die Ausgabe des Konverters. Mit derselben Technik können Sie auch hilfreiche Diffs für alle Arten von Binärdateien erhalten (ZIPs, JARs und andere Archive).

Vergleich von Dateien: git diff file

Der Befehl git diff hat auch eine explizite Option für Dateipfade. Der Vorgang git diff verarbeitet die angegebene Datei, sobald der Dateipfad übergeben wird. Im folgenden Beispiel vergleicht das Argument ./path/to/file die Änderungen im Arbeitsverzeichnis mit dem HEAD-Commit.

git diff

bash
git diff HEAD ./path/to/file

Vergleich aller Änderungen

Um Änderungen im gesamten Repository zu vergleichen, sollten Sie git diff ohne Dateipfad ausführen. Sie können also die obigen Beispiele ohne das Argument ./path/to/file aufrufen und erhalten dieselben Ergebnisse für alle Dateien im lokalen Repository.

Änderungen seit dem letzten Commit

Standardmäßig vergleicht git diff das Arbeitsverzeichnis mit dem Staging-Bereich (Index). Um alle nicht committeten Änderungen seit dem letzten Commit zu sehen:

git diff

bash
git diff

Vergleich von Dateien zwischen zwei Commits

An git diff können Git-Refs übergeben werden, etwa Namen von Heads, Tags und Branches. Jeder Commit in Git hat eine eindeutige Commit-ID, die Sie durch Ausführen von git log finden können. Sie können auch zwei Commit-IDs direkt übergeben, um sie miteinander zu vergleichen:

git diff

bash
git diff <commit-hash-1> <commit-hash-2>

Vergleich von Branches

Der Vergleich von Branches wird ähnlich wie bei anderen Ref-Eingaben für git diff ausgeführt. Sehen wir uns Beispiele mit dem Punktoperator an:

git diff

bash
git diff branch1..branch2

Die zwei Punkte im obigen Beispiel zeigen, dass die Diff-Eingabe die Spitzen beider Branches sind. Sie erhalten dasselbe Ergebnis, wenn die Punkte weggelassen und stattdessen ein Leerzeichen zwischen den Branches verwendet wird. Außerdem gibt es einen Drei-Punkte-Operator:

git diff

bash
git diff branch1...branch2

Der Drei-Punkte-Operator ändert den ersten Eingabeparameter branch1, der das Diff initiiert. Er wandelt branch1 in eine Referenz auf den gemeinsamen Vorfahren-Commit zwischen den beiden Diff-Eingaben um. Der letzte Eingabeparameter bleibt unverändert als Spitze von branch2.

Vergleich der Dateien aus zwei Branches

Um eine bestimmte Datei in Branches zu vergleichen, sollten Sie den Pfad der Datei als drittes Argument an git diff übergeben:

git diff

bash
git diff master new_branch ./test.txt

Practice

What are the functionalities and options of the 'git diff' command?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.