Direkt zum Inhalt

Git Diff Erklärt: Ein vollständiger Leitfaden mit Beispielen

Lerne, wie du mit git diff Codeänderungen effektiv verfolgen kannst, von einfachen Vergleichen bis hin zu fortgeschrittenen Techniken. Entdecke Visualisierungstools, spezielle Befehle und Workflows für ein besseres Code-Management.
Aktualisierte 5. März 2025  · 12 Min. Lesezeit

Git diff ist dein Fenster zu den Änderungen in deinem Code-Repository. Im Kern ist es ein Befehl, der dir die Unterschiede zwischen verschiedenen Zuständen deiner Dateien anzeigt - sei es, dass du deine aktuelle Arbeit mit dem vergleichst, was du bereits bereitgestellt hast, oder dass du Änderungen zwischen Zweigen und Commits vergleichst. Sieh es als Gits Art, die Frage zu beantworten: "Was hat sich verändert?" Wenn du git diff aufrufst, analysiert Git den Inhalt der Dateien Zeile für Zeile, um zu erkennen, was hinzugefügt, entfernt oder geändert wurde, und stellt diese Informationen in einem standardisierten Format dar, das genau aufzeigt, was und wo geändert wurde.

Git diff hilft Entwicklern dabei, die Qualität des Codes zu sichern, indem es einen klaren Überblick über die Änderungen gibt, bevor sie übertragen werden. Hier erfahren wir, wie du diesen wichtigen Befehl effektiv nutzen kannst, von grundlegenden Vergleichen bis hin zu fortgeschrittenen Techniken, die deinen Entwicklungsworkflow und die Zusammenarbeit im Team verbessern werden.

Voraussetzungen

Um diesem Lernprogramm folgen zu können, solltest du mit diesen Git-Konzepten vertraut sein:

  • Grundlegende Git-Arbeitsabläufe (init, add, commit)
  • Git Repositories und ihre Struktur
  • Zweige und wie sie funktionieren
  • Commits und Commit-Historie
  • Der Aufenthaltsbereich (Index)

Wenn du diese Konzepte auffrischen musst, werden dir diese Ressourcen helfen:

Du brauchst Git installiert auf deinem System installiert haben, um den Beispielen zu folgen. Alle Befehle können in einem Terminal oder einer Eingabeaufforderung ausgeführt werden.

Warum Git Diff für Entwickler unverzichtbar ist

Jeder Entwickler muss wissen, was sich in seinem Code geändert hat, egal ob er alleine oder in einem Team von Hunderten arbeitet. Ohne git diff müsstest du raten, welche Zeilen du geändert hast, was die Fehlersuche und Zusammenarbeit fast unmöglich macht.

Git diff ist für das Änderungsmanagement unverzichtbar und dient als Grundlage für die Erstellung qualitativ hochwertiger Software durch effektive Überprüfungsprozesse. Wenn du Änderungen untersuchst, liefert git diff den nötigen Kontext, um nicht nur zu verstehen, was sich geändert hat, sondern auch, warum diese Änderungen wichtig sind. 

Dieser direkte Einblick in die Codeentwicklung hilft den Teams, Standards einzuhalten und zu verhindern, dass Fehler in die Produktion gelangen.

Wenn Projekte immer komplexer werden, wird git diff aus mehreren Gründen unverzichtbar:

  • Ändere die Überprüfung:  Bestätige genau, was du übertragen willst, und verhindere so, dass du versehentlich Debugging-Code oder nicht zusammenhängende Änderungen einfügst.
  • Wissenstransfer: Verstehen, was Teamkollegen getan haben, ohne ganze Dateien lesen zu müssen
  • Konfliktlösung:  Identifiziere genau, wo und wie Änderungen bei Zusammenführungen in Konflikt geraten
  • Historische Analyse:  Finde heraus, wann bestimmte Änderungen eingeführt wurden, um Fehler zu finden oder die Entwicklung von Funktionen zu verstehen
  • Gezielte Code-Reviews:  Konzentriere die Aufmerksamkeit auf die Teile des Codes, die sich tatsächlich geändert haben, um Zeit zu sparen und die Qualität der Überprüfung zu verbessern.

Um Git Diff effektiv nutzen zu können, musst du die zugrunde liegende Architektur verstehen, die diese Vergleiche ermöglicht - das "Drei-Baum-Modell" von Git.

Die Drei-Bäume-Architektur von Git

Um Git Diff zu verstehen, musst du zunächst die grundlegende "Drei-Bäume"-Architektur von Git begreifen. Trotz des Namens handelt es sich dabei nicht um echte Bäume im Dateisystem, sondern um drei verschiedene Zustände, in denen dein Code existiert. 

Stell dir diese Zustände als drei verschiedene Versionen deines Projekts vor, die Git gleichzeitig verfolgt: das Arbeitsverzeichnis (deine eigentlichen Dateien), die Staging Area (oder der Index, in dem Änderungen für das Commit vorbereitet werden) und das Repository (die Commit-Historie deines Projekts, die im Verzeichnis .git gespeichert ist ).

Die Drei-Baum-Architektur von Git mit Arbeitsverzeichnis, Staging Area und Repository

Quelle: Hashnode

Das Arbeitsverzeichnis enthält die Dateien, die du aktiv bearbeitest - hier schreibst du Code, nimmst Änderungen vor und testest deine Arbeit. Die Staging Area dient als Vorbereitungszone, in der du auswählst, welche Änderungen in deine nächste Übergabe einbezogen werden sollen. Du kannst es dir wie eine Laderampe vorstellen, auf der die Pakete (deine Änderungen) vor dem Versand organisiert werden. 

Schließlich speichert das Repository die gesamte Geschichte deines Projekts als eine Reihe von Commits, Momentaufnahmen deines Codes zu bestimmten Zeitpunkten, die miteinander verbunden sind und eine historische Kette bilden.

Git diff vergleicht diese drei Zustände in verschiedenen Kombinationen. Wenn du git diff ohne Argumente ausführst, vergleicht es dein Arbeitsverzeichnis mit der Staging Area und zeigt die Änderungen an, die du gemacht hast, aber noch nicht in die Staging Area übertragen hast .

Mit git diff --staged kannst du die Staging Area mit dem letzten Commit vergleichen und sehen, was in deinem nächsten Commit enthalten sein wird .

Und git diff HEAD vergleicht dein Arbeitsverzeichnis direkt mit dem letzten Commit und zeigt alle nicht übertragenen Änderungen unabhängig vom Staging-Status an.

Diese Vergleichspunkte bilden die Grundlage für alle Diff-Operationen in Git:

  • Arbeitsverzeichnis ↔ Staging Area: Welche Änderungen habe ich vorgenommen, aber noch nicht inszeniert? (git diff )
  • Staging Area ↔ Repository: Welche Änderungen habe ich inszeniert, die als Nächstes begangen werden sollen? (git diff --staged )
  • Arbeitsverzeichnis ↔ Repository: Wie groß ist die Differenz zwischen meinen Arbeitsdateien und der letzten Übertragung? (git diff HEAD )
  • Zwischen den Commits: Wie hat sich der Code in der Geschichte entwickelt? (git diff commit1-hash commit2-hash )

Wenn du diese Architektur verstehst, hast du das mentale Modell, das du brauchst, um mit git diff genau zu erkennen, was, wo und wann in deiner Codebasis geändert wurde.

Mit diesem architektonischen Verständnis können wir nun herausfinden, wie wir Git Diff-Befehle in der Praxis einsetzen können, um Einblicke in die Entwicklung deines Codes in diesen drei Zuständen zu erhalten.

Grundlegende Verwendung von Git Diff

Lass uns ein Beispielprojekt zur Datenanalyse erstellen, um git diff in Aktion zu zeigen. Wir werden ein kleines Repository mit Python-Skripten, CSV-Daten und Textdateien einrichten, das wir im Laufe des Tutorials verändern können.

# Create and initialize our project
mkdir data-analysis-project
cd data-analysis-project
git init

# Create initial files
echo "# Data Analysis Project\nA sample project to demonstrate git diff functionality." > README.md
echo "import pandas as pd\n\ndef load_data(filename):\n return pd.read_csv(filename)\n\ndef analyze_data(data):\n return data.describe()" > analysis.py
echo "id,name,value\n1,alpha,10\n2,beta,20\n3,gamma,30" > data.csv
echo "DEBUG=False\nDATABASE_PATH=./data/" > config.txt
echo "def normalize_data(data):\n return (data - data.min()) / (data.max() - data.min())" > utils.py

# Make our first commit
git add .
git commit -m "Initial commit with basic project structure"

# Check the directory structure
> tree

.
├── README.md
├── analysis.py
├── config.txt
├── data.csv
└── utils.py

Unser Projekt hat jetzt fünf Dateien unter Versionskontrolle, was uns eine Grundlage gibt, um verschiedene Diff-Szenarien zu demonstrieren. Im weiteren Verlauf werden wir diese Dateien ändern, um zu zeigen, wie git diff Änderungen in verschiedenen Kontexten aufzeigt.

Die Ergebnisse von git diff verstehen

Wenn du einen git diff-Befehl ausführst, folgt die Ausgabe einem standardisierten Format, das klar aufzeigt, was sich geändert hat. Ändern wir unsere analysis.py Datei, um einen Vergleich in Aktion zu sehen:

# Update analysis.py with a new function
echo "import pandas as pd\n\ndef load_data(filename):\n return pd.read_csv(filename)\n\ndef analyze_data(data):\n return data.describe()\n\ndef visualize_data(data):\n return data.plot(kind='bar')" > analysis.py

Untersuchen wir nun den resultierenden git diff:

git diff

Du wirst eine ähnliche Ausgabe wie diese sehen:

Ausgabe eines Beispiels für den Befehl git diff

Hinweis: Um die Ausgabe von git diff zu beenden, drücke "q" in deinem Terminal.

Lasst uns diese Ausgabe aufschlüsseln:

  1. Die Kopfzeile (diff --git a/analysis.py b/analysis.py ) zeigt, welche Datei verglichen wird, nämlich analysis.py
  2. Die Datei-Metadaten (index db0e049..a7a7ab0 100644 ) zeigt die internen Git-Kennungen für die Vorher- und Nachher-Versionen
  3. Die Dateimarkierungen (--- a/analysis.py and +++ b/analysis.py ) zeigen die "Vorher"- und "Nachher"-Dateien an
  4. Der Hunk-Header (@@ -5,3 +5,6 @@) zeigt, welche Zeilen betroffen waren. Diese Notation kann wie folgt interpretiert werden:
  • -5,3 bedeutet, dass ab Zeile 5 in der Originaldatei 3 Zeilen im Diff angezeigt werden
  • +5,6 bedeutet, dass ab Zeile 5 der geänderten Datei 6 Zeilen im Diff angezeigt werden
  • Die Differenz zwischen diesen Zahlen zeigt an, dass 3 Zeilen hinzugefügt wurden

5. DerInhalt von ändert sich, wobei Zeilen, die mit + beginnen, Ergänzungen anzeigen

Bei größeren Dateien gruppiert git diff die Änderungen in "Hunks" - Abschnitte der Datei, die Änderungen enthalten. Jeder Hunk hat seine eigene Kopfzeile mit Zeilennummern, die dir helfen, die Änderungen in der Datei zu finden.

Vergleich von Arbeitsverzeichnis und Staging Area

Wenn du git diff ohne Argumente ausführst, wird dein Arbeitsverzeichnis (aktueller Stand der Dateien) mit der Staging Area (Änderungen, die übertragen werden sollen) verglichen. Das ist nützlich, um zu überprüfen, was du geändert hast, aber noch nicht für deine nächste Übertragung vorbereitet hast.

Zur Veranschaulichung werden wir mehrere Dateien ändern:

# Update README.md
echo "# Data Analysis Project\nA sample project to demonstrate git diff functionality.\n\n## Installation\nRun \pip install -r requirements.txt" > README.md

# Update data.csv
echo "id,name,value\n1,alpha,10\n2,beta,20\n3,gamma,30\n4,delta,40" > data.csv

Lass uns jetzt nur die Änderungen in der README.md durchführen:

git add README.md

Wenn du jetzt git diff aufrufst, werden nur die noch nicht umgesetzten Änderungen an data.csv und der obigen Datei analysis.py angezeigt:

Beispielhafte Ausgabe für den Befehl git diff

So kannst du dich auf das konzentrieren, was du noch nicht in Szene gesetzt hast. Wenn du sehen willst, was du bereits inszeniert hast:

git diff --staged # or git diff --cached (they're synonyms)

Ausgabe für einen git diff-Befehl

Dies zeigt die Änderungen an der README.md an, die bereit für die Übergabe sind. Dieser Arbeitsablauf ist wichtig, um saubere, logische Commits zu erstellen. Du kannst Teile deiner Arbeit, die zusammen einen Sinn ergeben, zusammenfassen, die Zusammenfassung überprüfen, um sicherzustellen, dass es sich um eine kohärente Änderungseinheit handelt, und sie dann festschreiben.

Vergleich von Bereitstellungsraum und letzter Begehung

Der Befehl git diff --staged vergleicht deine Staging Area mit deinem letzten Commit. Dies zeigt dir genau, was in deinem nächsten Commit enthalten sein wird, wenn du git commit jetzt ausführst.

Lass uns unsere data.csv-Änderungen bereitstellen und untersuchen, was bereitgestellt wurde:

git add data.csv
git diff --staged

In der Ausgabe werden nun die Änderungen an README.md und data.csv angezeigt, da beide gestuft worden sind. Dieser Überprüfungsschritt ist entscheidend, bevor du die Änderungen festlegst - er ist deine letzte Verteidigungslinie gegen unbeabsichtigte Änderungen.

Ein üblicher Arbeitsablauf könnte so aussehen:

  1. Änderungen an mehreren Dateien vornehmen
  2. Führe git diff aus, um alle Änderungen zu überprüfen
  3. Verwende git add selektiv, um logische Gruppen von Änderungen durchzuführen.
  4. Führe git diff --staged aus, um zu überprüfen, was du vorhast zu tun.
  5. Übertrage die abgestuften Änderungen mit git commit -m "Your message"
  6. Wiederhole dies für andere logische Gruppierungen von Änderungen

Dieser methodische Ansatz hilft dabei, eine saubere, aussagekräftige Commit-Historie zu erhalten, die es einfacher macht, die Entwicklung deines Projekts zu verstehen und festzustellen, wo möglicherweise Probleme aufgetreten sind. Mit zunehmender Erfahrung werden dir diese diff-Befehle zur zweiten Natur und dienen dir als ständige Begleiter im Entwicklungsprozess.

Lass uns unsere Commits machen, bevor wir zur nächsten Phase übergehen:

# data.csv and README.md are to be committed
git commit -m "Modify data.csv and README.md files"

# Stage and commit analysis.py
git add analysis.py
git diff --staged  # Review the changes one more time
git commit -m "Add a new function to analysis.py"

Fortgeschrittene Git Diff-Techniken

Nachdem wir nun die Grundlagen von git diff kennen, wollen wir uns mit leistungsfähigeren Techniken beschäftigen, mit denen du Änderungen in deinen Projekten besser verfolgen und analysieren kannst. Wir werden mit unserem Datenanalyseprojekt weiterarbeiten, um diese Zwischenkonzepte zu demonstrieren.

Vergleiche zwischen verschiedenen Referenzen

Git basiert auf dem Konzept der Referenzen - Zeiger auf bestimmte Zustände deines Codes. Zu diesen Referenzen gehören Zweige, Commits und Tags. Der Befehl git diff kann zwei dieser Referenzen miteinander vergleichen, um zu sehen, was sich zwischen ihnen geändert hat.

Lass uns einen neuen Zweig für die Entwicklung eines Features erstellen und einige Änderungen vornehmen:

# Create and switch to a new branch
git checkout -b feature/advanced-analytics

# Modify the analysis.py file with a new function
echo "import pandas as pd
import numpy as np

def load_data(filename):
   return pd.read_csv(filename)

def analyze_data(data):
   return data.describe()

def visualize_data(data):
   return data.plot(kind='bar')

def perform_advanced_analysis(data):
   """Performs advanced statistical analysis on the dataset"""
   results = {}
   results['correlation'] = data.corr()
   results['skew'] = data.skew()
   return results" > analysis.py

# Commit the changes
git add analysis.py
git commit -m "Add advanced analysis function"

Jetzt können wir unseren Feature-Zweig mit dem Hauptzweig vergleichen:

git diff main feature/advanced-analytics

Dieser Befehl zeigt alle Unterschiede zwischen den beiden Zweigen an - jede Datei, die geändert, hinzugefügt oder gelöscht wurde. Du siehst die Änderungen, die wir an analysis.py vorgenommen haben, einschließlich unserer neuen Importe und Funktionen (drücke mehrmals die Eingabetaste, da der vollständige Diff im Terminal abgeschnitten wird).

Um mit einem bestimmten Commit zu vergleichen, kannst du den Commit-Hash verwenden:

git log --oneline  # Find the commit hash you want to compare with

Ausgabe des Befehls git log --oneline

git diff 7b3105e  # Replace 7b3105e with the actual commit hash you want to compare

Diese Vergleichsfunktion ist von unschätzbarem Wert, wenn:

  • Vorbereitung auf Code-Reviews durch Einsicht in alle Änderungen in einem Feature-Zweig
  • Prüfen, welche Änderungen der Zweig eines Kollegen vor dem Zusammenführen mit sich bringen würde
  • Verstehen, wie sich deine Codebasis zwischen verschiedenen Releases oder Versionen entwickelt hat

Bestimmte Dateien vergleichen

Wenn du mit großen Repositories arbeitest, willst du dich oft auf Änderungen an bestimmten Dateien oder Verzeichnissen konzentrieren, anstatt alle Unterschiede zu sehen. Git diff macht dies einfach, indem es dir erlaubt, Pfade anzugeben.

Lass uns Änderungen an mehreren Dateien vornehmen:

# Update config.txt
echo "DEBUG=True
DATABASE_PATH=./data/
LOG_LEVEL=INFO" > config.txt

# Update utils.py
echo "def normalize_data(data):
   return (data - data.min()) / (data.max() - data.min())

def clean_data(data):
   return data.dropna()" > utils.py

Um nur Änderungen an der Konfigurationsdatei zu sehen:

git diff config.txt

Oder um eine bestimmte Datei zwischen Zweigen zu vergleichen:

# Compare analysis.py file between main and feature/advanced-analytics branches
git diff main feature/advanced-analytics -- analysis.py

Das -- im obigen Befehl hilft Git, zwischen Referenzen und Dateipfaden zu unterscheiden. Dies ist besonders nützlich, wenn:

  • Arbeiten in Repositories mit vielen Dateien, aber mit Fokus auf bestimmte Komponenten (was oft der Fall sein wird)
  • Überprüfen, wie sich die Konfiguration in den verschiedenen Zweigen geändert hat
  • Überprüfung nur der kritischsten Dateien in einer großen Menge von Änderungen

Kontextabhängige Diff-Optionen

Git diff bietet mehrere Optionen, mit denen du die Anzeige der Unterschiede anpassen kannst, damit du dich leichter auf wichtige Änderungen konzentrieren kannst.

Wenn es zum Beispiel um Änderungen der Codeformatierung geht, können Unterschiede im Leerzeichen wichtige semantische Änderungen verdecken. Lass uns das mit einer Formatierungsänderung demonstrieren:

# Make a whitespace change to analysis.py
sed -i '' 's/    return/  return/g' analysis.py  # Reduce indentation

Ein Vergleich mit dem Standard-Git-Diff zeigt, dass sich Leerzeichen geändert haben (beachte, dass die Return-Anweisungen falsch ausgerichtet sind):

git diff analysis.py

# OUT:
--- a/analysis.py
+++ b/analysis.py
@@ -2,17 +2,17 @@ import pandas as pd
import numpy as np

def load_data(filename):
-    return pd.read_csv(filename)
+  return pd.read_csv(filename)

def analyze_data(data):
-    return data.describe()
+  return data.describe()

def visualize_data(data):
-    return data.plot(kind='bar')
+  return data.plot(kind='bar')

def perform_advanced_analysis(data):
    Performs advanced statistical analysis on the dataset
    results = {}
    results['correlation'] = data.corr()
    results['skew'] = data.skew()
-    return results
+  return results

Aber wir können Änderungen durch Leerzeichen ignorieren (hier werden keine Änderungen angezeigt, da wir nur Leerzeichen entfernt haben):

git diff -w analysis.py  # or --ignore-all-space

Eine weitere nützliche Option ist die Kontrolle von Kontextlinien - die unveränderten Linien, die um Änderungen herum angezeigt werden:

git diff -U1 analysis.py  # Show only 1 line of context (default is 3)
git diff -U5 analysis.py  # Show 5 lines of context

Diese kontextbezogenen Optionen sind besonders wertvoll, wenn:

  • Überprüfung von Code, der automatisch formatiert wurde
  • Konzentration auf funktionale Änderungen statt auf Stiländerungen
  • Du brauchst mehr Kontext, um eine bestimmte Veränderung zu verstehen
  • Arbeiten mit großen Dateien, bei denen der Standardkontext zu viel Output erzeugen würde

Wenn du diese Techniken beherrschst, hast du eine viel bessere Kontrolle darüber, wie du Änderungen in deiner Codebasis überprüfst und verstehst, wodurch dein Entwicklungsworkflow effizienter und deine Code Reviews effektiver werden.

Lass uns die letzten Änderungen festschreiben, bevor wir zu den fortgeschrittenen git diff-Anwendungen übergehen:

git add .
git commit -m "Modify analysis.py, config.txt, and utils.py"

Erweiterte Git Diff-Anwendungen

Aufbauend auf unseren Kenntnissen der mittleren Techniken von git diff, wollen wir nun einige fortgeschrittene Anwendungen erkunden, die deine Git-Kenntnisse auf die nächste Stufe bringen. Diese fortgeschrittenen Techniken sind besonders nützlich, wenn du an komplexen Codebases arbeitest oder mit größeren Teams zusammenarbeitest.

Externe Diff-Tools verwenden

Das in Git eingebaute Diff ist zwar leistungsfähig, aber manchmal bietet ein visuelles Diff-Tool mehr Klarheit, vor allem bei komplexen Änderungen. Mit Git kannst du externe Tools konfigurieren, um deine Diff-Erfahrung zu verbessern.

Lass uns ein beliebtes visuelles Vergleichstool einrichten. Wir werden VSCode als Beispiel verwenden, aber eine ähnliche Konfiguration funktioniert auch für Tools wie Beyond Compare, Meld oder KDiff3:

# Configure Git to use VSCode as the diff tool (project-specific)
git config diff.tool vscode
git config difftool.vscode.cmd "code --wait --diff \$LOCAL \$REMOTE"

# To use other popular tools, you could use:
# For Beyond Compare (project-specific):
git config diff.tool bc3
git config difftool.bc3.path "/path/to/beyond/compare"

# Installation commands:
# For Beyond Compare:
# On macOS: brew install --cask beyond-compare
# On Ubuntu: sudo apt-get install beyond-compare
# On Windows: Download from https://www.scootersoftware.com/download.php

# Note: To apply these settings globally instead of just the current project,
# add the --global flag to each command, for example:
# git config --global diff.tool vscode

Anstelle von git diff kannst du jetzt verwenden:

git difftool main feature/advanced-analytics

Dadurch wird dein konfiguriertes visuelles Diff-Tool geöffnet, um die Änderungen anzuzeigen. Hier siehst du, wie Beyond Compare aussieht:

Schnittstelle von Beyond Compare git diff tool

Visuelle Diff-Tools bieten mehrere Vorteile:

  1. Der Seite-an-Seite-Vergleich macht es einfacher, den Kontext zu erkennen
  2. Syntaxhervorhebung, die sich an deine Editoreinstellungen anpasst
  3. Erweiterte Navigation zwischen Änderungen
  4. Die Möglichkeit, Dateien direkt zu bearbeiten und dabei Unterschiede zu überprüfen

Wenn du große Änderungen oder Dateien mit komplexen Strukturen (wie verschachteltes JSON oder XML) überprüfst, können visuelle Diff-Tools das Verständnis und die Effizienz erheblich verbessern.

Spezialisierte diff-Befehle

Git bietet spezielle Diff-Befehle, die dir für bestimmte Anwendungsfälle eine genauere Kontrolle ermöglichen. Lass uns einige dieser mächtigen Befehle kennenlernen:

git diff-tree untersucht die Unterschiede zwischen Baumobjekten (Verzeichnissen):

# Get the hash of the last two commits
LAST_COMMIT=$(git rev-parse HEAD)
PREV_COMMIT=$(git rev-parse HEAD~1)

# Show changes in the last commit
git diff-tree --patch $PREV_COMMIT $LAST_COMMIT

git diff-index vergleicht den Arbeitsbaum mit dem Index (Staging Area) oder einem Baum:

# Compare working directory with the index
git diff-index --patch HEAD

git diff-index ist besonders nützlich für Skripting und Automatisierung. Damit kannst du programmgesteuert prüfen, welche Änderungen in den nächsten Commit übernommen werden, was für Pre-Commit-Hooks und Validierungsskripte sehr nützlich ist.

Du könntest es zum Beispiel in einer CI/CD-Pipeline verwenden, um zu überprüfen, ob bestimmte Dateien nicht verändert wurden oder um sicherzustellen, dass Konfigurationsänderungen bestimmten Mustern folgen, bevor du Commits zulässt.

git diff-files zeigt Änderungen zwischen Dateien im Arbeitsverzeichnis und im Index an:

# Check differences for specific files
git diff-files --patch config.txt

Diese speziellen Befehle sind besonders nützlich für:

  • Erstellen von benutzerdefinierten Git-Workflows und -Skripten
  • Probleme mit den Interna von Git beheben
  • Gezielte Analyse des Repository-Status
  • Automatisierungswerkzeuge bauen, die mit Git interagieren

Analyse der Code-Historie

Eine der leistungsfähigsten Anwendungen von git diff ist die Analyse, wie sich der Code im Laufe der Zeit entwickelt hat, was für die Fehlersuche oder das Verständnis der Entwicklung von Funktionen entscheidend sein kann.

Untersuchen wir einen bestimmten Commit unter Verwendung der speziellen ^! Notation:

# Get the hash of our advanced analytics commit
ANALYTICS_COMMIT=$(git log --oneline | grep "advanced analysis" | cut -d ' ' -f 1)

# Show only changes introduced in that specific commit
git diff $ANALYTICS_COMMIT^!

Die ^! Syntax ist eine Abkürzung für den Vergleich eines Commits mit seinem Elternteil und zeigt genau, was sich in diesem Commit geändert hat.

Um nachzuvollziehen, wie sich eine bestimmte Datei im Laufe der Zeit entwickelt hat:

# Analyze how analysis.py changed over the last 3 commits
git log -p -3 analysis.py

Bei der Suche nach einem Fehler kannst du git diff mit git bisect verwenden:

# Add a bug to simulate a regression
echo "import pandas as pd
import numpy as np

def load_data(filename):
   # Bug: accidentally returning None instead of the data
   pd.read_csv(filename)
   return None

def analyze_data(data):
   return data.describe()

def visualize_data(data):
   return data.plot(kind='bar')

def perform_advanced_analysis(data):
   results = {}
   results['correlation'] = data.corr()
   results['skew'] = data.skew()
   return results" > analysis.py

git add analysis.py
git commit -m "Update analysis.py with a hidden bug"

# Now use git bisect to find when the bug was introduced
git bisect start
git bisect bad  # Mark current commit as containing the bug
git bisect good main  # Mark the main branch as working correctly

# Git will check out commits for you to test
# Once found, you can examine the exact change that introduced the bug
git diff HEAD^!

Git bisect ist ein leistungsstarkes Debugging-Werkzeug, das deine Commit-Historie binär durchsucht, um herauszufinden, welcher Commit einen Fehler eingeführt hat. In Kombination mit git diff entsteht so ein effizienter Arbeitsablauf:

1. Starte den Halbierungsprozess mit git bisect start

2. Markiere den aktuellen Commit als schlecht (der den Fehler enthält) mit git bisect bad

3. Markiere einen bekannt guten Commit (bei dem der Fehler nicht existiert) mit git bisect good

4. Git checkt automatisch einen Commit in der Mitte deines Verlaufs aus, den du testen kannst.

5. Nachdem du den aktuellen Commit getestet hast, gibst du das Ergebnis an git weiter:

  • Wenn der Fehler in dieser Übertragung existiert: git bisect bad
  • Wenn der Fehler in dieser Übertragung nicht vorhanden ist: git bisect good

6. Git sucht auf der Grundlage deines Feedbacks (nach jedem git bisect bad/good Befehl) weiter nach verschiedenen Commits und grenzt die Suche jedes Mal ein. Wiederhole den Prüf- und Markierungsprozess, bis Git den ersten fehlerhaften Commit identifiziert.

7. Sobald git den problematischen Commit findet, zeigt es eine Meldung an, welcher Commit den Fehler verursacht hat.

8. Untersuche genau, was sich bei der identifizierten Verpflichtung geändert hat: git diff HEAD^!

9. Dieser Befehl zeigt dir genau an, welcher Code in dem Commit geändert wurde, der den Fehler verursacht hat, damit du dich bei der Fehlersuche auf diese Änderungen konzentrieren kannst.

10. Steig jederzeit aus der Halbierung aus mit: git bisect reset Damit kehrst du zu dem Zweig zurück, auf dem du dich vor der Halbierung befunden hast.

11. Du kannst den Bisect-Prozess auch mit automatisieren: git bisect run Wo ist ein Befehl, der 0 für gute Commits und ungleich Null für schlechte Commits zurückgibt.

Dieser Arbeitsablauf reduziert die Debugging-Zeit drastisch, besonders in großen Codebases mit vielen Commits zwischen funktionierenden und defekten Zuständen.

Diese Techniken der Geschichtsanalyse sind von unschätzbarem Wert für:

  • Herausfinden, wann und warum ein Fehler eingeführt wurde
  • Verstehen der Entwicklung eines Merkmals oder einer Komponente
  • Auditing von Änderungen für Sicherheitsüberprüfungen
  • Dokumentieren des Entscheidungsprozesses bei Codeänderungen

Wenn du diese fortgeschrittenen Git-Diff-Anwendungen beherrschst, kannst du präzise durch die Historie deines Projekts navigieren, Probleme effizienter beheben und tiefere Einblicke in die Entwicklung deiner Codebasis gewinnen.

Git Diff Befehlsreferenz

Git diff bietet eine Vielzahl von Optionen, um die Ausgabe und das Verhalten für bestimmte Situationen anzupassen. Hier findest du eine umfassende Übersicht über die am häufigsten verwendeten Parameter, um deine Differenzialanalyse zu verbessern:

Grundlegende Vergleichsoptionen

  • git diff - Arbeitsverzeichnis mit Staging Area vergleichen
  • git diff --staged (oder --cached )- Vergleich der Staging Area mit der letzten Übergabe
  • git diff HEAD - Arbeitsverzeichnis mit der letzten Übertragung vergleichen
  • git diff - Arbeitsverzeichnis mit einem bestimmten Commit vergleichen
  • git diff - Vergleiche zwei bestimmte Commits
  • git diff - Zwei Zweige vergleichen

Pfadbegrenzung

  • git diff -- - Vergleich auf eine bestimmte Datei oder ein bestimmtes Verzeichnis beschränken
  • git diff --stat - Zusammenfassung der Änderungen anzeigen (geänderte Dateien, Einfügungen, Löschungen), eine sehr nützliche Option für große Diffs
  • git diff --name-only - Nur die Namen der geänderten Dateien anzeigen
  • git diff --name-status - Namen und Status (hinzugefügt, geändert, gelöscht) von geänderten Dateien anzeigen

Kontrolle anzeigen

  • git diff -w (oder --ignore-all-space) - Whitespace-Änderungen ignorieren
  • git diff --ignore-space-change - Änderungen in der Anzahl der Leerzeichen ignorieren
  • git diff --color-words - Unterschiede auf Wortebene mit Farbe anzeigen
  • git diff --word-diff - Unterschiede auf Wortebene in einem anderen Format anzeigen
  • git diff -U - n Zeilen Kontext anzeigen (Standard ist 3)
  • git diff --no-prefix - Die Präfixe a/ und b/ in der Diff-Ausgabe nicht anzeigen

Inhaltliche Filterung

  • git diff --binary - Änderungen an Binärdateien anzeigen
  • git diff -S - Suche nach Änderungen, die die angegebene Zeichenfolge hinzufügen oder entfernen
  • git diff -G - Suche nach Änderungen, die dem angegebenen Regex-Muster entsprechen
  • git diff --pickaxe-all - Wenn du -S oder -G verwendest, werden alle Änderungen in der Datei angezeigt, nicht nur die passenden.

Format Optionen

  • git diff --patch-with-stat - Patch und Statistikübersicht anzeigen
  • git diff --compact-summary - Statistikübersicht in einem kompakten Format anzeigen
  • git diff --numstat - Zeige Statistiken in einem maschinenfreundlichen Format
  • git diff --summary - Zusammenfassung der Erstellung/Löschung anzeigen

Diese Optionen können kombiniert werden, um leistungsstarke, gezielte Vergleiche zu erstellen. Zum Beispiel, um Änderungen auf Wortebene in einer bestimmten Datei zu sehen und Leerzeichen zu ignorieren:

git diff --color-words -w -- analysis.py

Oder um alle Stellen zu finden, an denen eine bestimmte Funktion hinzugefügt oder entfernt worden sein könnte:

git diff -S"def perform_advanced_analysis" main feature/advanced-analytics

Wenn du diese Optionen verstehst, kannst du dich auf die wirklich wichtigen Änderungen konzentrieren und deine Arbeitsabläufe bei der Codeüberprüfung und -analyse effizienter gestalten. Egal, ob du nach Fehlern suchst, einen Pull-Request vorbereitest oder einfach nur nachvollziehen willst, was sich geändert hat, die richtige Git-Diff-Option kann dir die Arbeit erheblich erleichtern.

Fazit

In diesem Artikel haben wir git diff als vielseitigen Befehl zum Anzeigen von Codeänderungen kennengelernt. Wir haben den Vergleich von Arbeitsdateien mit Staged Changes, die Untersuchung von Unterschieden zwischen Branches und Commits und die Verwendung spezieller Befehle für tiefere Einblicke behandelt. Wenn du Git Diff in deinen Arbeitsablauf integrierst, kannst du sauberere Commits erstellen, Probleme frühzeitig erkennen und bessere Code-Reviews durchführen. 

Egal, ob du alleine oder im Team arbeitest, mit dem Beherrschen von Git Diff kannst du nicht nur Code schreiben, sondern auch verstehen, wie sich deine Codebasis im Laufe der Zeit weiterentwickelt.

Wenn du dein Git-Fachwissen weiter ausbauen willst, schau dir diese wertvollen Ressourcen an: 

Diese Ressourcen helfen dir, auf dem, was du über git diff gelernt hast, aufzubauen und deine Versionskontrolle auf die nächste Stufe zu heben.

Git Diff FAQs

Was ist der Unterschied zwischen git diff und git diff --staged?

git diff zeigt die Änderungen zwischen deinem Arbeitsverzeichnis und dem Staging-Bereich (nicht übertragene Änderungen), während git diff --staged die Änderungen zwischen deinem Staging-Bereich und dem letzten Commit (was als nächstes übertragen wird) anzeigt.

Wie kann ich Änderungen zwischen zwei Zweigen vergleichen?

Verwende git diff branch1 branch2, um alle Unterschiede zwischen den Zweigen zu sehen. Um bestimmte Dateien zu vergleichen, schreibe add -- path/to/file nach den Zweignamen.

Wie kann ich Änderungen mit Leerzeichen in git diff ignorieren?

Verwende git diff -w oder git diff --ignore-all-space, um alle Änderungen an Leerzeichen zu ignorieren. So kannst du dich besser auf die inhaltlichen Unterschiede im Code konzentrieren und nicht auf die Formatierung.

Kann ich git diff verwenden, um herauszufinden, wann eine bestimmte Änderung eingeführt wurde?

Ja! Verwende git diff -S"search string", um herauszufinden, wann Text hinzugefügt/entfernt wurde, oder kombiniere ihn mit git log -p, um die Entwicklung eines bestimmten Codes zu sehen. Um Fehler aufzuspüren, ist git bisect mit diff sehr hilfreich.

Wie kann ich git diff auf eine anschaulichere Weise betrachten?

Konfiguriere externe Diff-Tools mit git config diff.tool , um visuelle Diff-Anwendungen wie VSCode, Beyond Compare oder Meld zu verwenden, die Side-by-Side-Vergleiche mit besserer Visualisierung ermöglichen.


Bex Tuychiev's photo
Author
Bex Tuychiev
LinkedIn

Ich bin ein Data Science Content Creator mit über 2 Jahren Erfahrung und einem der größten Follower auf Medium. Ich schreibe gerne ausführliche Artikel über KI und ML mit einem etwas sarkastischen Stil, denn man muss etwas tun, damit sie nicht so langweilig sind. Ich habe mehr als 130 Artikel verfasst und einen DataCamp-Kurs gemacht, ein weiterer ist in Vorbereitung. Meine Inhalte wurden von über 5 Millionen Augenpaaren gesehen, von denen 20.000 zu Followern auf Medium und LinkedIn wurden. 

Themen

Top DataCamp Kurse

Kurs

Foundations of Git

4 hr
46K
Familiarize yourself with Git for version control. Explore how to track, compare, modify, and revert files, as well as collaborate with colleagues using Git.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Der Blog

Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn

Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

4 Min.

Der Blog

Die 32 besten AWS-Interview-Fragen und Antworten für 2024

Ein kompletter Leitfaden zur Erkundung der grundlegenden, mittleren und fortgeschrittenen AWS-Interview-Fragen, zusammen mit Fragen, die auf realen Situationen basieren. Es deckt alle Bereiche ab und sorgt so für eine abgerundete Vorbereitungsstrategie.
Zoumana Keita 's photo

Zoumana Keita

30 Min.

Der Blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates hat im zweiten Quartal 2023 über 20.000 Stipendien an unsere gemeinnützigen Partner vergeben. Erfahre, wie fleißige benachteiligte Lernende diese Chancen in lebensverändernde berufliche Erfolge verwandelt haben.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Der Blog

Top 30 Generative KI Interview Fragen und Antworten für 2024

Dieser Blog bietet eine umfassende Sammlung von Fragen und Antworten zu generativen KI-Interviews, die von grundlegenden Konzepten bis hin zu fortgeschrittenen Themen reichen.
Hesam Sheikh Hassani's photo

Hesam Sheikh Hassani

15 Min.

Der Blog

Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

20 Min.

Der Blog

2022-2023 DataCamp Classrooms Jahresbericht

Zu Beginn des neuen Schuljahres ist DataCamp Classrooms motivierter denn je, das Lernen mit Daten zu demokratisieren. In den letzten 12 Monaten sind über 7.650 neue Klassenzimmer hinzugekommen.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 Min.

Mehr anzeigenMehr anzeigen