Git Diff im Detail

GitBeginner
Jetzt üben

Einführung

Willkommen, Git-Entdecker! Heute tauchen wir tief in eine der leistungsstärksten und am häufigsten verwendeten Funktionen von Git ein: den Befehl git diff. Wenn Sie sich jemals gefragt haben, welche Änderungen Sie genau an Ihren Dateien vorgenommen haben oder verschiedene Versionen Ihres Codes vergleichen mussten, ist git diff das Werkzeug Ihrer Wahl.

Der Befehl git diff ist wie ein Mikroskop für Ihre Code-Änderungen. Er ermöglicht es Ihnen, die präzisen Unterschiede zwischen verschiedenen Zuständen Ihres Repositorys zu sehen – egal, ob es sich um Änderungen in Ihrem Arbeitsverzeichnis, Ihrem Staging-Bereich, zwischen Commits oder sogar zwischen Branches handelt.

In diesem Lab werden wir untersuchen, wie Sie:

  1. Ihr Arbeitsverzeichnis mit dem Staging-Bereich vergleichen
  2. Ihren Staging-Bereich mit dem letzten Commit vergleichen
  3. Verschiedene Branches vergleichen
  4. Spezifische Dateien vergleichen
  5. Externe Diff-Tools für einen visuelleren Vergleich nutzen

Am Ende dieses Labs werden Sie ein git diff-Experte sein und in der Lage sein, Ihre Änderungen mit Präzision und Zuversicht zu prüfen. Diese Fähigkeit ist entscheidend, um Ihre Arbeit zu kontrollieren, Commits vorzubereiten und effektiv mit anderen zusammenzuarbeiten.

Lassen Sie uns eintauchen und die Möglichkeiten von git diff erkunden!

Einrichten Ihres Arbeitsbereichs

Bevor wir mit dem Vergleichen beginnen, richten wir einen Arbeitsbereich mit einigen Dateien und Commits ein. Wir erstellen ein neues Verzeichnis, initialisieren ein Git-Repository und fügen einige Dateien mit mehreren Commits hinzu.

Öffnen Sie Ihr Terminal und geben Sie diese Befehle ein:

cd ~/project
mkdir git-diff-lab
cd git-diff-lab
git init

Lassen Sie uns nun einige Dateien erstellen und eine Reihe von Commits durchführen, indem Sie die folgenden Befehle kopieren und einfügen:

echo "## Git Diff Lab" > README.md
git add README.md
git commit -m "Initial commit"

echo "function greet(name) {" > greet.js
echo "  return 'Hello, ' + name + '!';" >> greet.js
echo "}" >> greet.js
git add greet.js
git commit -m "Add greet function"

echo "const numbers = [1, 2, 3, 4, 5];" > numbers.js
echo "console.log(numbers);" >> numbers.js
git add numbers.js
git commit -m "Add numbers array"

Hier ist eine Zusammenfassung dessen, was wir gerade getan haben:

  1. Wir haben eine README-Datei erstellt und unseren ersten Commit durchgeführt.
  2. Wir haben eine JavaScript-Datei mit einer Begrüßungsfunktion erstellt und committet.
  3. Wir haben eine weitere JavaScript-Datei mit einem Zahlen-Array erstellt und committet.

Jetzt haben wir ein Repository mit einer Historie, die wir untersuchen können!

Vergleich von Arbeitsverzeichnis und Staging-Bereich

Die grundlegendste Anwendung von git diff besteht darin, die Änderungen in Ihrem Arbeitsverzeichnis zu sehen, die noch nicht für den nächsten Commit vorgemerkt (gestaged) wurden. Lassen Sie uns das untersuchen.

Zuerst nehmen wir einige Änderungen an unserer Datei greet.js vor:

echo "function farewell(name) {" >> greet.js
echo "  return 'Goodbye, ' + name + '!';" >> greet.js
echo "}" >> greet.js

Verwenden wir nun git diff, um diese Änderungen zu sehen:

git diff

Sie sollten eine Ausgabe sehen, die dieser ähnelt:

diff --git a/greet.js b/greet.js
index 95f5574..a3641f6 100644
--- a/greet.js
+++ b/greet.js
@@ -1,3 +1,7 @@
 function greet(name) {
   return 'Hello, ' + name + '!';
 }
+function farewell(name) {
+  return 'Goodbye, ' + name + '!';
+}

Lassen Sie uns diese Ausgabe analysieren:

  • Die erste Zeile zeigt, welche Dateien verglichen werden.
  • Die Zeilen mit +++ und --- zeigen, welche Dateiversionen verglichen werden (a/ ist das Original, b/ ist die neue Version).
  • Die Zeile mit @@ liefert Kontext darüber, wo in der Datei die Änderungen auftreten.
  • Zeilen, die mit + beginnen, sind Hinzufügungen, während - Entfernungen anzeigen würde.

Dieses Diff zeigt uns, dass wir drei neue Zeilen zu greet.js hinzugefügt haben.

Drücken Sie q, um die Diff-Ansicht zu verlassen.

Lassen Sie uns diese Änderungen nun in den Staging-Bereich aufnehmen:

git add greet.js

Wenn Sie git diff erneut ausführen, sehen Sie keine Ausgabe. Das liegt daran, dass git diff standardmäßig nur nicht vorgemerkte Änderungen anzeigt. Um vorgemerkte Änderungen zu sehen, müssen Sie git diff --staged verwenden, was wir im nächsten Schritt behandeln werden.

Denken Sie daran: git diff ohne Argumente vergleicht Ihr Arbeitsverzeichnis mit Ihrem Staging-Bereich. Es ist ein hervorragender Weg, um Ihre Änderungen zu überprüfen, bevor Sie sie für den Commit vormerken.

Vergleich von Staging-Bereich und letztem Commit

Nachdem wir unsere Änderungen nun vorgemerkt haben, lernen wir, wie wir den Staging-Bereich mit dem letzten Commit vergleichen. Dies ist nützlich, um zu überprüfen, welche Änderungen in Ihrem nächsten Commit enthalten sein werden.

Um den Unterschied zwischen dem Staging-Bereich und dem letzten Commit zu sehen, verwenden Sie:

git diff --staged

Sie sollten eine Ausgabe sehen, die der aus dem vorherigen Schritt ähnelt und die Hinzufügung der farewell-Funktion zeigt.

Dieser Befehl ist besonders nützlich, wenn Sie über einen längeren Zeitraum Änderungen vorgemerkt haben und alles überprüfen möchten, was in Ihren nächsten Commit einfließen wird.

Lassen Sie uns eine weitere Änderung vornehmen und vormerken, um zu sehen, wie das funktioniert:

echo "console.log(greet('World'));" >> greet.js
git add greet.js

Wenn Sie nun git diff --staged ausführen, sehen Sie sowohl die farewell-Funktion als auch die neue console.log-Zeile.

Beachten Sie, dass git diff --staged (oder git diff --cached, was synonym ist) Ihnen zeigt, welche Änderungen sich derzeit in Ihrem Staging-Bereich im Vergleich zum letzten Commit befinden. Es ist eine großartige Möglichkeit, Ihre vorgemerkten Änderungen vor dem Committen noch einmal zu kontrollieren.

Vergleich von Branches

Git Diff ist auch äußerst nützlich, um verschiedene Branches zu vergleichen. Dies hilft besonders dann, wenn Sie an einem Feature-Branch arbeiten und sehen möchten, wie er sich vom Hauptzweig (Main/Master) unterscheidet.

Lassen Sie uns einen neuen Branch erstellen und einige Änderungen vornehmen:

git checkout -b feature-branch
echo "const PI = 3.14159;" >> numbers.js
git add numbers.js
git commit -m "Add PI constant"

Vergleichen wir nun diesen Branch mit dem Master-Branch:

git diff master feature-branch

Sie sollten eine Ausgabe sehen, die das Hinzufügen der Konstante PI in der Datei numbers.js zeigt.

Dieser Befehl zeigt die Unterschiede zwischen den Spitzen (Tips) der Branches master und feature-branch. Er sagt quasi: "Zeige mir, welche Änderungen in feature-branch vorhanden sind, die nicht in master sind".

Sie können auch Ihren aktuellen Branch mit einem anderen Branch vergleichen, indem Sie den ersten Branchnamen weglassen:

git diff master

Dies vergleicht Ihren aktuellen Branch (feature-branch) mit master.

Beachten Sie beim Vergleich von Branches:

  • Änderungen, die im ersten Branch (oder dem aktuellen Branch, falls weggelassen) vorhanden sind, aber nicht im zweiten, werden als Entfernungen (mit einem -) angezeigt.
  • Änderungen, die im zweiten Branch vorhanden sind, aber nicht im ersten, werden als Hinzufügungen (mit einem +) angezeigt.

Diese Funktion ist unglaublich nützlich, wenn Sie Merges vorbereiten oder sehen möchten, welche Neuerungen ein Feature-Branch einführt.

Vergleich spezifischer Dateien

Manchmal möchten Sie nur die Änderungen für eine bestimmte Datei oder eine Gruppe von Dateien sehen. Git Diff ermöglicht dies ganz einfach.

Lassen Sie uns Änderungen an mehreren Dateien vornehmen:

echo "function multiply(a, b) { return a * b; }" >> greet.js
echo "const doubledNumbers = numbers.map(n => n * 2);" >> numbers.js

Wenn wir nun nur die Änderungen in greet.js sehen möchten, können wir Folgendes verwenden:

git diff greet.js

Dies zeigt ausschließlich die Änderungen an, die an greet.js vorgenommen wurden.

Sie können auch eine spezifische Datei zwischen zwei Branches vergleichen:

git diff master feature-branch -- numbers.js

Dies zeigt die Unterschiede in numbers.js zwischen den Branches master und feature-branch.

Das -- im obigen Befehl wird verwendet, um den Dateipfad von den Branchnamen zu trennen. Es ist nicht immer zwingend erforderlich, aber es ist eine gute Gewohnheit, um Mehrdeutigkeiten zu vermeiden – besonders wenn Ihre Dateinamen mit Branchnamen verwechselt werden könnten.

Denken Sie daran, dass Sie Dateipfade mit jedem der gelernten Diff-Befehle verwenden können. Dies ist besonders in größeren Projekten nützlich, bei denen Sie Änderungen in vielen Dateien haben, sich aber nur auf einige wenige konzentrieren möchten.

Verwendung externer Diff-Tools

Obwohl das integrierte Diff von Git sehr mächtig ist, wünschen Sie sich manchmal eine visuellere Darstellung Ihrer Änderungen. Viele Entwickler nutzen zu diesem Zweck externe Diff-Tools.

Ein beliebtes Werkzeug ist vimdiff. Konfigurieren wir Git so, dass es vimdiff verwendet:

git config --global diff.tool vimdiff
git config --global difftool.prompt false

Anstelle von git diff können Sie nun git difftool verwenden:

git difftool

Dies öffnet jede geänderte Datei in vimdiff. Sie können mit :n zur nächsten Datei und mit :prev zur vorherigen Datei navigieren. Um vimdiff zu beenden, verwenden Sie :qa!.

Es gibt viele andere verfügbare Diff-Tools wie Beyond Compare, KDiff3 oder P4Merge. Die Wahl des Werkzeugs hängt oft von persönlichen Vorlieben und Ihrem Betriebssystem ab.

Denken Sie daran: Während visuelle Diff-Tools sehr hilfreich sein können, insbesondere bei umfangreichen Änderungen, sind sie nicht immer notwendig. Viele Entwickler werden sehr versiert im Lesen der Standard-git diff-Ausgabe und bevorzugen deren Geschwindigkeit und Einfachheit für den täglichen Gebrauch.

Zusammenfassung

Herzlichen Glückwunsch, Diff-Detektiv! Sie haben gerade einen tiefen Einblick in die Welt von git diff erhalten. Lassen Sie uns die wichtigsten Konzepte rekapitulieren:

  1. Vergleich von Arbeitsverzeichnis und Staging-Bereich: Sie haben gelernt, wie Sie nicht vorgemerkte Änderungen in Ihrem Arbeitsverzeichnis sehen.
  2. Vergleich von Staging-Bereich und letztem Commit: Sie haben entdeckt, wie Sie vorgemerkte Änderungen vor dem Commit überprüfen.
  3. Vergleich von Branches: Sie haben gesehen, wie man verschiedene Branches vergleicht, um festzustellen, wie sie sich auseinanderentwickelt haben.
  4. Vergleich spezifischer Dateien: Sie haben gelernt, wie Sie Ihr Diff auf bestimmte Dateien von Interesse fokussieren.
  5. Verwendung externer Diff-Tools: Sie haben erkundet, wie Sie visuelle Diff-Tools für eine andere Perspektive auf Ihre Änderungen nutzen können.

Der Befehl git diff ist ein unverzichtbares Werkzeug in Ihrem Git-Werkzeugkasten. Er ermöglicht es Ihnen, Änderungen präzise zu inspizieren, egal ob Sie einen Commit vorbereiten, die Arbeit eines Kollegen überprüfen oder versuchen, die Historie Ihres Projekts zu verstehen.

Denken Sie daran, dass der kompetente Umgang mit git diff Übung erfordert. Lassen Sie sich nicht entmutigen, wenn die Ausgabe anfangs kryptisch erscheint – mit der Zeit werden Sie Diffs schnell und effizient lesen können.

Setzen Sie Ihre Git-Reise fort und erkunden Sie weiterhin die verschiedenen Optionen und Anwendungsfälle für git diff. Es ist ein vielseitiger Befehl, der mit vielen anderen Git-Funktionen kombiniert werden kann, um Ihnen tiefe Einblicke in die Änderungen Ihres Projekts zu geben.

Viel Erfolg beim Vergleichen, und mögen Ihre Code-Änderungen immer klar und gewollt sein!