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.

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
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.txtWenn 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
echo "this is a diff example" > test.txtErst jetzt können wir einen Diff anzeigen und die Ausgabe besprechen. Das Ausführen von git diff erzeugt Folgendes:
git diff
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 exampleDiff-Eingabequellen
Unten finden Sie die Vergleichseingabe von diff. Dadurch werden a/test.txt und b/test.txt an diff übergeben.
git diff
diff --git a/test.txt b/test.txtMetadaten
Diese Zeile zeigt einige interne Git-Metadaten. Die Zahlen in dieser Ausgabe entsprechen den Hash-Identifikatoren der Git-Objektversion.
git diff
index 6b0c6cf..b37e70a 100644Symbole 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
--- a/test.txt
+++ b/test.txtDiff-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
@@ -1 +1 @@
-this is a git diff test example
+this is a diff exampleDie 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
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
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 exampleVergleichen 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
git diff
Binary files a/script.pdf and b/script.pdf differGit 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
[diff "pdfconv"]
textconv=pdftohtml -stdoutDann 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
*.pdf diff=pdfconvNach 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
git diff HEAD ./path/to/fileVergleich 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
git diffVergleich 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
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
git diff branch1..branch2Die 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
git diff branch1...branch2Der 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
git diff master new_branch ./test.txtPractice
What are the functionalities and options of the 'git diff' command?