git diff | Atlassian Git Tutorial (2023)

Änderungen mit "git diff" vergleichen

Bei einem Vergleich werden zwei Eingabe-Datasets herangezogen und die Unterschiede zwischen ihnen ausgegeben. git diff ist ein vielseitiger Git-Befehl, durch dessen Ausführung ein Vergleich von Git-Datenquellen durchgeführt wird. Diese Datenquellen können Commits, Branches, Dateien und vieles mehr sein. In diesem Dokument werden wir auf typische git diff-Aufrufe und den Vergleich von Workflow-Mustern eingehen. Der git diff-Befehl wird häufig zusammen mit git status und git log verwendet, um den aktuellen Status eines Git-Repositorys zu analysieren.

Diffs lesen: Ausgaben

Rohausgabeformat

Die folgenden Beispiele werden in einem einfachen Repository ausgeführt. Das Repository wird mit den nachstehenden Befehlen erstellt:

$:>mkdirdiff_test_repo
$:>cddiff_test_repo
$:>touchdiff_test.txt
$:>echo"thisisagitdifftestexample">diff_test.txt
$:>gitinit.
InitializedemptyGitrepositoryin/Users/kev/code/test/.git/
$:>gitadddiff_test.txt
$:>gitcommit-am"adddifftestfile"
[main(root-commit)6f77fc3]adddifftestfile
1filechanged,1insertion(+)
createmode100644diff_test.txt

Wenn wir an dieser Stelle git diff ausführen, gibt es keine Ausgabe. Das ist ein normales Verhalten, da es keine Änderungen im Repository zu vergleichen gibt. Sobald das Repository erstellt wurde und wir die Datei diff_test.txt hinzugefügt haben, können wir die Inhalte in der Datei ändern und mit der Diff-Ausgabe experimentieren.

$:>echo"thisisadiffexample">diff_test.txt

Durch die Ausführung dieses Befehls wird der Inhalt der Datei diff_test.txt geändert. Sobald sie modifiziert wurde, können wir einen Diff anzeigen und die Ausgabe analysieren. Wenn jetzt git diff ausgeführt wird, wird folgende Ausgabe erstellt:

diff--gita/diff_test.txtb/diff_test.txt
index6b0c6cf..b37e70a100644
---a/diff_test.txt
+++b/diff_test.txt
@@-1+1@@
-thisisagitdifftestexample
+thisisadiffexample

Sehen wir uns nun eine detailliertere Aufschlüsselung der Diff-Ausgabe an.

1. Vergleich der Eingabe

diff--gita/diff_test.txtb/diff_test.txt

Diese Zeile zeigt die Eingabequellen des Diff an. Wir können erkennen, dass a/diff_test.txt und b/diff_test.txt an Diff übergeben wurden.

2. Metadaten

index6b0c6cf..b37e70a100644

Diese Zeile zeigt einige interne Git-Metadaten an. Diese Information wirst du höchstwahrscheinlich nicht brauchen. Die Zahlen in dieser Ausgabe entsprechen den Hash-Kennungen der Git-Objektversion.

3. Markierungen für Änderungen

---a/diff_test.txt
+++b/diff_test.txt

Diese Zeilen stellen eine Legende dar, die jeder Diff-Eingabequelle Symbole zuweist. In diesem Fall werden Änderungen in a/diff_test.txt durch --- und Änderungen in b/diff_test.txt durch +++ gekennzeichnet.

4. Diff-Blöcke

Die verbleibende Diff-Ausgabe ist eine Liste mit verschiedenen Diff-Blöcken. Ein Vergleich zeigt nur die Abschnitte der Datei an, die Änderungen enthalten. Im vorliegenden Beispiel haben wir nur einen Block, da wir mit einem einfachen Szenario arbeiten. Blöcke haben ihre eigene granulare Ausgabesemantik.

@@-1+1@@
-thisisagitdifftestexample
+thisisadiffexample

Die erste Zeile ist der Blockheader. Jedem Block ist ein von @@-Symbolen umschlossener Header vorangestellt. Der Inhalt des Headers ist eine Zusammenfassung der Änderungen, die an der Datei vorgenommen wurden. In unserem vereinfachten Beispiel sehen wir -1 +1. Das bedeutet, dass es in Zeile eins Änderungen gab. In einem realistischeren Vergleich würdest du Header wie etwa folgenden sehen:

@@-34,6+34,8@@

Bei diesem Header-Beispiel wurden 6 Zeilen ab Zeilennummer 34 extrahiert. Außerdem wurden 8 Zeilen ab Zeile 34 hinzugefügt.

Der verbleibende Inhalt des Diff-Blocks zeigt die kürzlichen Änderungen an. Jeder geänderten Zeile wird ein + oder - vorangestellt. Dies weist darauf hin, von welcher Version der Diff-Eingabe die Änderungen stammen. Wie vorhin besprochen, weist - auf Änderungen in a/diff_test.txt und + auf Änderungen in b/diff_test.txt hin.

Änderungen hervorheben

1. git diff --color-words

git diff verfügt ebenfalls über einen speziellen Modus zur Hervorhebung von Änderungen, der eine bessere Granularität bietet: --color-words. Dieser Modus übersetzt durch Leerzeichen hinzugefügte und entfernte Zeilen in Tokens und vergleicht diese anschließend.

$:>gitdiff--color-words
diff--gita/diff_test.txtb/diff_test.txt
index6b0c6cf..b37e70a100644
---a/diff_test.txt
+++b/diff_test.txt
@@-1+1@@
thisisagitdifftestexample

Die Ausgabe zeigt jetzt nur die farbkodierten Wörter an, die geändert wurden.

2. git diff-highlight

Wenn du die Git-Quelle klonst, findest du ein Unterverzeichnis namens contrib. Es enthält einige zu Git gehörende Tools und andere interessante Dinge, die noch nicht zum Git-Kern gehören. Eines davon ist ein Perl-Skript namens diff-highlight. Diff-highlight bringt gleiche Zeilen von Diff-Ausgaben zusammen und hebt Teilwortfragmente hervor, die geändert wurden.

$:>gitdiff|/your/local/path/to/git-core/contrib/diff-highlight/diff-highlight
diff--gita/diff_test.txtb/diff_test.txt
index6b0c6cf..b37e70a100644
---a/diff_test.txt
+++b/diff_test.txt
@@-1+1@@
-thisisagitdifftestexample
+thisisadiffexample

Jetzt haben wir unseren Diff auf die kleinste mögliche Änderung abgespeckt.

Binärdateien vergleichen

Neben den Textdatei-Dienstprogrammen, die wir bisher gezeigt haben, kann git diff auch für Binärdateien durchgeführt werden. Allerdings ist die Standardausgabe nicht besonders hilfreich.

$:>gitdiff
Binaryfilesa/script.pdfandb/script.pdfdiffer

Git hat ein Feature, mit dem du einen Shellbefehl spezifizieren kannst, um Inhalte in deinen Binärdateien zu transformieren, bevor der Vergleich durchgeführt wird. Dazu sind jedoch einige vorbereitende Maßnahmen erforderlich. Lege zunächst einen textconv-Filter fest, der beschreibt, wie eine bestimmte Art von Binärdatei in Text konvertiert wird. Wir verwenden ein einfaches Dienstprogramm namens pdftohtml (über Homebrew erhältlich), um PDFs in ein visuell lesbares HTML-Format zu konvertieren. Du kannst dies für ein einzelnes Repository einrichten, indem du deine Datei .git/config bearbeitest, oder global, indem du ~ /.gitconfig bearbeitest.

[diff"pdfconv"]
textconv=pdftohtml-stdout

Danach musst du lediglich ein oder mehrere Dateimuster mit unserem pdfconv-Filter zuordnen. Hierzu erstellst du eine .gitattributes-Datei im Stamm deines Repositorys.

*.pdfdiff=pdfconv

Nach der Konfiguration wird git diff zunächst die Binärdatei mithilfe des festgelegten Konverterskripts ausführen und die Konverterausgabe vergleichen. Du kannst dieselbe Technik anwenden, um nützliche Vergleiche von allen möglichen Arten an Binärdateien zu erhalten, wie ZIP- und JAR-Dateien und anderen Archiven. Durch die Verwendung von unzip -l (oder ähnlich) anstelle von pdf2html werden Pfade angezeigt, die zwischen Commits-Images hinzugefügt oder entfernt wurden. Mit exiv2 kannst du Änderungen von Metadaten wie Dokumente zu Bildabmessungen anzeigen. Es gibt Konvertierungstools, um ODF-, DOC- und andere Dokumentformate in Nur-Text umzuwandeln. Falls es keine formalen Konverter gibt, können häufig Strings für Binärdateien verwendet werden.

Vergleich von Dateien: git diff file

Dem Befehl git diff kann eine explizite Dateipfadoption übergeben werden. Wenn ein Dateipfad an git diff übergeben wird, wird der Vergleichsvorgang auf die spezifizierte Datei ausgelegt. Die nachstehenden Beispiele zeigen diesen Verwendungstyp.

gitdiffHEAD./path/to/file

Dieses Beispiel ist auf ./path/to/file ausgelegt und wird bei Aufruf die spezifischen Änderungen im Arbeitsverzeichnis mit dem Index vergleichen und Änderungen anzeigen, die noch nicht bereitgestellt sind. git diff führt den Vergleich standardmäßig mit HEAD aus. Wird HEAD wie im obigen Beispiel weggelassen, hat git diff ./path/to/file denselben Effekt.

gitdiff--cached./path/to/file

Wenn git diff mit der Option --cached aufgerufen wird, werden die bereitgestellten Änderungen mit dem lokalen Repository verglichen. Die Option --cached bedeutet dasselbe wie --staged.

Vergleich aller Änderungen

Bei einem Aufruf von git diff ohne Dateipfad werden Änderungen im gesamten Repository verglichen. Die obigen, dateispezifischen Beispiele können mit dem Argument ./path/to/file aufgerufen werden und liefern dieselben Ausgabeergebnisse für alle Dateien im lokalen Repository.

Änderungen seit dem letzten Commit

Der Befehl git diff zeigt dir standardmäßig Änderungen seit dem letzten Commit, die nicht committet wurden.

gitdiff

Dateien zwischen zwei verschiedenen Commits vergleichen

An git diff können Git-Verweise an Commits übergeben werden, die verglichen werden sollen. Einige Beispielverweise sind HEAD, Tags und Branch-Namen. Jeder Commit in Git verfügt über eine Commit-ID, die du durch die Ausführung von GIT LOG erhalten kannst. Du kannst diese Commit-ID auch an git diff übergeben.

gitlog--pretty=oneline
957fbc92b123030c389bf8b4b874522bdf2db72caddfeature
ce489262a1ee34340440e55a0b99ea6918e19e7arenamesomeclasses
6b539f280d8b0ec4874671bae9c6bed80b788006refactorsomecodeforfeature
646e7863348a427e1ed9163a9a96fa759112f102addsomecopytobody

$:>gitdiff957fbc92b123030c389bf8b4b874522bdf2db72cce489262a1ee34340440e55a0b99ea6918e19e7a

Vergleich von Branches

Vergleich von zwei Branches

Branches werden wie alle anderen Referenzeingaben mit git diff verglichen.

gitdiffbranch1..other-feature-branch

In diesem Beispiel wird der Punktoperator vorgestellt. Die zwei Punkte darin zeigen an, dass es sich bei der Vergleichseingabe um die Enden beider Branches handelt. Derselbe Effekt tritt auf, wenn die Punkte ausgelassen und stattdessen ein Leerzeichen zwischen den Branches gesetzt wird. Es gibt im Übrigen einen Operator mit drei Punkten:

gitdiffbranch1...other-feature-branch

Der Operator mit drei Punkten initiiert den Vergleich, indem er den ersten Eingabeparameter branch1 ändert. Dadurch wird aus branch1 ein Verweis des Vorgänger-Commits, der von den zwei Vergleichseingaben gemeinsam genutzt wird, dem gemeinsamen Vorgänger von branch1 und anderen Feature Branches. Der letzte Eingabeparameter bleibt unverändert wie die Enden anderer Feature Branches.

Vergleich von Daten aus zwei Branches

Um eine bestimmte Datei über verschiedene Branches hinweg zu vergleichen, übergibst du den Pfad der Datei als drittes Argument direkt an git diff.

gitdiffmainnew_branch./diff_test.txt

Zusammenfassung

Auf dieser Seite wurden der Vergleichsprozess in Git und der Befehl git diff besprochen. Wir haben erklärt, wie die git diff-Ausgabe und die verschiedenen darin enthaltenen Daten gelesen werden. Wir haben Beispiele gezeigt, wie die git diff-Ausgabe mit Hervorhebungen und Farbe geändert werden kann. Es wurden verschiedene Vergleichsmethoden besprochen, z. B. der Vergleich von Dateien in Branches und in bestimmten Commits. Neben dem git diff-Befehl haben wir auch git log und git checkout verwendet.

Top Articles
Latest Posts
Article information

Author: Rev. Porsche Oberbrunner

Last Updated: 08/29/2023

Views: 6062

Rating: 4.2 / 5 (73 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Rev. Porsche Oberbrunner

Birthday: 1994-06-25

Address: Suite 153 582 Lubowitz Walks, Port Alfredoborough, IN 72879-2838

Phone: +128413562823324

Job: IT Strategist

Hobby: Video gaming, Basketball, Web surfing, Book restoration, Jogging, Shooting, Fishing

Introduction: My name is Rev. Porsche Oberbrunner, I am a zany, graceful, talented, witty, determined, shiny, enchanting person who loves writing and wants to share my knowledge and understanding with you.