Git
Deutsch ▾ Topics ▾ Latest version ▾ git-diff last updated in 2.47.0

NAME

git-diff – Zeigt die Unterschiede zwischen Commits, Commit und Arbeitsbereich usw.

ÜBERSICHT

git diff [<options>] [<commit>] [--] [<path>…​]
git diff [<options>] --cached [<commit>] [--] [<path>…​]
git diff [<options>] <commit> [<commit>…​] <commit> [--] [<path>…​]
git diff [<options>] <commit>…​<commit> [--] [<path>…​]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path>

BESCHREIBUNG

Show changes between the working tree and the index or a tree, changes between the index and a tree, changes between two trees, changes resulting from a merge, changes between two blob objects, or changes between two files on disk.

git diff [<Optionen>] [--] [<Pfad>…​]

Mit dieser Befehlssyntax können die Änderungen angezeigt werden, die Sie relativ zum Index vorgenommen haben (Staging-Area für den nächsten Commit). Mit anderen Worten, die Unterschiede sind das, was Sie Git mitteilen könnten, um es später zum Index hinzuzufügen, aber Sie haben es immer noch nicht getan. Sie können diese Änderungen mit git-add[1] bereitstellen (stagen).

git diff [<Optionen>] --no-index [--] <Pfad> <Pfad>

Diese Form dient dem Vergleich der beiden angegebenen Pfade auf dem Dateisystem. Sie können die Option --no-index weglassen, wenn Sie den Befehl in einem von Git kontrollierten Arbeitsbereich ausführen und mindestens einer der Pfade außerhalb des Arbeitsbereichs liegt oder wenn Sie den Befehl außerhalb eines von Git kontrollierten Arbeitsbereichs ausführen. Diese Form impliziert die Option --exit-code.

git diff [<Optionen>] --cached [<Commit>] [--] [<Pfad>…​]

Auf diese Art können Sie sich die Änderungen ansehen, die Sie für den nächsten Commit, relativ zu dem angegebenen <Commit>, vorgenommen haben. Normalerweise werden Sie einen Vergleich mit dem letzten Commit sehen wollen. Wenn Sie also den <Commit> nicht angeben, wird standardmäßig HEAD verwendet. Wenn HEAD nicht existiert (z.B. wegen noch nicht erstelltem Branch) und <Commit> nicht angegeben wird, zeigt dies alle Änderungen in der Staging-Area an. --staged ist ein Synonym für --cached.

git diff [<Optionen>] <Commit> [--] [<Pfad>…​]

Zeigt die Unterschiede zwischen dem Arbeitsbereich und dem angegebenen <Commit> an. Sie können HEAD verwenden, um ihn mit dem letzten Commit zu vergleichen oder den Namen eines Branchs, um ihn mit der Spitze eines anderen Branchs zu vergleichen.

git diff [<Optionen>] <Commit> <Commit> [--] [<Pfad>…​]

Zeigt die Änderungen zwischen zwei beliebigen <Commit>s an.

git diff [<options>] <commit> <commit>…​ <commit> [--] [<path>…​]

In dieser Form können Sie die Ergebnisse eines Merge Commits betrachten. Der erste aufgelistete <Commit> muss der Merge selbst sein; die restlichen zwei oder mehr Commits sollten seine Eltern sein. Ein praktischer Weg, den gewünschten Satz von Revisionen zu erzeugen, ist die Verwendung des Suffixs ^@. Wenn z.B. master einen Merge-Commit benennt, ergibt git diff master master^@ das gleiche kombinierte Diff wie git show master.

git diff [<Optionen>] <Commit>..<Commit> [--] [<Pfad>…​]

This is synonymous to the earlier form (without the "..") for viewing the changes between two arbitrary <commit>. If <commit> on one side is omitted, it will have the same effect as using HEAD instead.

git diff [<Optionen>] <Commit>...<Commit> [--] [<Pfad>…​]

Dieser Befehl zeigt die Änderungen auf dem Branch an, der den zweiten <Commit> enthält, beginnend mit einem gemeinsamen Vorfahren beider <Commit>s, bis zum zweiten <Commit>. "git diff A...B" ist äquivalent zu "git diff $(git merge-base A B) B". Sie können einen der beiden <Commit>s weglassen, wodurch stattdessen HEAD eingesetzt wird.

Für alle exotischen Anwendungsfälle, weisen wir darauf hin, dass alle <Commit>s in den vorstehenden Beschreibungen, mit Ausnahme der letzten beiden Varianten, welche die "…​"-Notationen verwenden, beliebige <„Verzeichnis-Bäume“> sein können.

Eine ausführlichere Liste, wie <commit> spezifiziert werden kann, findet sich in gitrevisions[7] im Abschnitt „REVISIONEN SPEZIFIZIEREN“. Allerdings vergleicht "diff" immer zwei Versionen (Endpunkte) miteinander und keine Bereiche. Die Bereichsnotationen ("<commit>…​<commit>" und "<commit>...<commit>") bezeichnen hier also keinen Bereich (Range) wie es im Abschnitt "BEREICHE FESTLEGEN" in gitrevisions[7] beschrieben ist.

git diff [<options>] <blob> <blob>

Auf diese Art lassen sich die Unterschiede zwischen den Rohinhalten zweier Blob-Objekte anzeigen.

OPTIONEN

Warning

Missing de/diff-options.txt

See original version for this content.

-1 --base
-2 --ours
-3 --theirs

Vergleicht den Arbeitsbereich mit der "Basis"-Version (base, Stufe #1), „unserer Branch“ (ours, Stufe #2) oder „deren Branch“ (theirs, Stufe #3). Der Index enthält diese Stufen nur für nicht gemergte Einträge, d.h. bei der Auflösung von Konflikten. Siehe dazu git-read-tree[1] Abschnitt „3-Wege-Merge“ für weitere Informationen.

-0

Lässt die Diff-Ausgabe für nicht gemergte Beiträge weg und zeigt nur "Unmerged" an. Kann nur verwendet werden, wenn der Arbeitsbereich mit dem Index verglichen wird.

<Pfad>…​

Die <Pfad>-Parameter, sofern angegeben, werden verwendet, um das diff auf die benannten Pfade zu beschränken (auch Verzeichnisnamen können angegeben werden, um ein diff für alle Dateien darin zu erhalten).

Rohdaten-Ausgabe-Format

Die rohen Ausgabeformate von "git-diff-index", "git-diff-tree", "git-diff-files" und "git diff --raw" sind sehr ähnlich.

Die Befehle vergleichen alle zwei Sätze von Dingen; was verglichen wird, unterscheidet sich:

git-diff-index <baumartig>

vergleicht <baumartig> mit den Dateien auf dem Dateisystem.

git-diff-index --cached <baumartig>

vergleicht <baumartig> mit dem Index.

git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<Muster>…​]

vergleicht die Verzeichnis-Bäume, die durch die beiden Argumente bestimmt wurden.

git-diff-files [<Muster>…​]

vergleicht den Index mit den Dateien auf dem Dateisystem.

Der "git-diff-tree"-Befehl beginnt seine Ausgabe mit dem Ausgeben des Hashes von dem, was verglichen wird. Danach geben alle Befehle eine Ausgabezeile pro geänderter Datei aus.

Eine Ausgabezeile ist so formatiert:

direkt-bearbeiten      :100644 100644 bcd1234 0123456 M Datei0
kopieren-bearbeiten    :100644 100644 abcd123 1234567 C68 Datei1 Datei2
umbenennen-bearbeiten  :100644 100644 abcd123 1234567 R86 Datei1 Datei3
erstellen              :000000 100644 0000000 1234567 A Datei4
löschen                :100644 000000 1234567 0000000 D Datei5
nicht gemergt          :000000 000000 0000000 0000000 U Datei6

Das Folgende bedeutet (von links nach rechts):

  1. ein Doppelpunkt.

  2. Modus für "src"; 000000 falls erstellt oder nicht gemergt.

  3. ein Leerzeichen.

  4. Modus für "dst"; 000000, falls gelöscht oder nicht gemergt.

  5. ein Leerzeichen.

  6. SHA1-Hash für "src"; 0{40} falls erstellt oder nicht gemergt.

  7. ein Leerzeichen.

  8. sha1 for "dst"; 0{40} if deletion, unmerged or "work tree out of sync with the index".

  9. ein Leerzeichen.

  10. Status, gefolgt von optionaler "score"-Nummer.

  11. ein Tab oder ein NUL, wenn die -z-Option benutzt wird.

  12. Pfad für "src"

  13. ein Tab oder ein NUL, wenn die -z-Option benutzt wird; existiert nur für C oder R.

  14. Pfad für "dst"; existiert nur für C oder R.

  15. ein LF oder ein NUL, wenn die -z-Option benutzt wird, um den Datensatz zu beenden.

Mögliche Status-Buchstaben sind:

  • A: Hinzufügen einer Datei

  • C: Kopieren einer Datei in eine neue

  • D: Löschung einer Datei

  • M: Modifikation des Inhalts oder Modus einer Datei

  • R: Umbenennen einer Datei

  • T: change in the type of the file (regular file, symbolic link or submodule)

  • U: Datei ist nicht zusammengeführt (du musst die Zusammenführung abschließen, bevor es commited werden kann)

  • X: "unbekannt" Änderungstyp (höchstwahrscheinlich ein Bug, bitte melde ihn)

Die Status-Buchstaben C und R werden immer von einer Punktzahl gefolgt (die den Prozentsatz der Ähnlichkeit zwischen Quelle und Ziel des Verschiebens oder des Kopierens angibt). Auf den Status-Buchstaben M kann eine Punktzahl (die den Prozentsatz der Unähnlichkeit angibt) für das Umschreiben von Dateien folgen.

The sha1 for "dst" is shown as all 0’s if a file on the filesystem is out of sync with the index.

Beispiel:

:100644 100644 5be4a4a 0000000 M Datei.c

Ohne die Option -z werden Pfadnamen mit „ungewöhnlichen“ Zeichen in Anführungszeichen gesetzt, wie für die Konfigurationsvariable core.quotePath erklärt (siehe git-config[1]). Mit -z wird der Dateiname wortwörtlich ausgegeben und die Zeile mit einem NUL-Byte abgeschlossen.

diff-Format bei Merges

„git-diff-tree“, „git-diff-files“ und „git-diff --raw“ können die Option -c oder --cc benutzen, um Diff-Ausgaben auch für Merge-Commits zu erzeugen. Die Ausgabe unterscheidet sich von dem oben beschriebenen Format in der folgenden Weise:

  1. für jedes Elternteil ist ein Doppelpunkt vorhanden

  2. Es gibt weitere „src“-Modi und „src“-SHA1-Hashes

  3. Für jedes Elternteil ist der Status als verkettete Statuszeichen dargestellt

  4. Es gibt keine optionale „Score“-Zahl

  5. Pfadnamen der Datei werden durch Tabulatoren getrennt

For -c and --cc, only the destination or final path is shown even if the file was renamed on any side of history. With --combined-all-paths, the name of the path in each parent is shown followed by the name of the path in the merge commit.

Examples for -c and --cc without --combined-all-paths:

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	phooey.c

Examples when --combined-all-paths added to either -c or --cc:

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c	desc.c	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	foo.sh	bar.sh	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	fooey.c	fuey.c	phooey.c

Beachten Sie bitte, dass combined diff nur Dateien auflistet, die von allen Elternteilen modifiziert wurden.

Warning

Missing de/diff-generate-patch.txt

See original version for this content.

andere diff-Formate

Die Option --summary beschreibt neu hinzugefügte, gelöschte, umbenannte und kopierte Dateien. Die Option --stat fügt ein diffstat(1)-Diagramm zur Ausgabe hinzu. Diese Optionen können mit anderen Optionen, wie z.B. -p, kombiniert werden und sind für den Gebrauch durch Personen gedacht.

Wenn eine Änderung angezeigt wird, die eine Umbenennung oder eine Kopie beinhaltet, formatiert --stat die Pfadnamen kompakt, indem es gemeinsame Präfixe und Suffixe der Pfadnamen vereint. Zum Beispiel wird eine Änderung, die arch/i386/Makefile nach arch/x86/Makefile verschiebt, wobei noch 4 Zeilen modifiziert werden, wie folgt dargestellt:

arch/{i386 => x86}/Makefile    |   4 +--

Die Option --numstat liefert die diffstat(1)-Informationen, ist aber hauptsächlich die maschinelle Verarbeitung gedacht. Ein solcher Einsatz in der --numstat-Ausgabe sieht wie folgt aus:

1	2	README
3	1	arch/{i386 => x86}/Makefile

Das Folgende bedeutet (von links nach rechts):

  1. die Anzahl der eingefügten Zeilen;

  2. ein Tabulator;

  3. die Anzahl der gelöschten Zeilen;

  4. ein Tabulator;

  5. Pfadname (eventuell mit Informationen zum Umbenennen/Kopieren);

  6. eine neue Zeile.

Wenn die Ausgabeoption -z aktiv ist, wird die Ausgabe so formatiert:

1	2	README NUL
3	1	NUL arch/i386/Makefile NUL arch/x86/Makefile NUL

Das bedeutet:

  1. die Anzahl der eingefügten Zeilen;

  2. ein Tabulator;

  3. die Anzahl der gelöschten Zeilen;

  4. ein Tabulator;

  5. ein NUL (nur dann, falls umbenannt oder kopiert);

  6. Pfadname im Pre-Image;

  7. ein NUL (nur dann, falls umbenannt oder kopiert);

  8. Pfadname im Post-Image (existiert nur, falls umbenannt oder kopiert);

  9. ein NUL.

Die zusätzliche NUL vor dem Pre-Image-Pfad (falls eine Umbenennung vorliegt) soll es auslesenden Skripten ermöglichen zu erkennen, ob bei dem aktuell gelesenen Datensatz ein Single-Path-Datensatz oder ein Datensatz zum Umbenennen/Kopieren vorliegt, ohne ihn vorab lesen zu müssen. Nach dem Lesen von hinzugefügten und gelöschten Zeilen würde das Lesen bis zur NUL den Pfadnamen ergeben, wenn aber dieser NUL ist, zeigt der Datensatz zwei Pfade an.

BEISPIELE

Diverse Methoden zum Überprüfen ihres Arbeitsbereichs
$ git diff            (1)
$ git diff --cached   (2)
$ git diff HEAD       (3)
  1. Änderungen im Arbeitsbereich, die noch nicht im Index für den nächsten Commit vorbereitet wurden.

  2. Änderungen zwischen dem Index und dem letzten Commit. Die Daten, die Sie committen würden, wenn Sie git commit ohne die Option -a ausführen.

  3. Änderungen zwischen dem Index und dem letzten Commit. Das würden Sie committen, wenn Sie "git commit -a" ausführen

Vergleichen beliebiger Commits
$ git diff test            (1)
$ git diff HEAD -- ./test  (2)
$ git diff HEAD^ HEAD      (3)
  1. Statt die neuesten Version des aktuellen Branchs zu verwenden, wird die neueste Version der Branch „test“ verglichen.

  2. Anstatt mit der neuesten Version der Branch „test“ zu vergleichen, wird mit der neuesten Version (HEAD) der aktuellen Branch verglichen, allerdings ist der Vergleich auf die bezeichnete Datei (./test) beschränkt.

  3. Vergleicht die Version vor dem letzten Commit mit dem letzten Commit.

Branches vergleichen
$ git diff topic master    (1)
$ git diff topic..master   (2)
$ git diff topic...master  (3)
  1. Vergleich zwischen den neuesten Versionen der topic und der master Branch.

  2. Wie oben.

  3. Änderungen, die am Branch master seit Start des Branch topic vorgenommen wurden.

Die diff Ausgabe einschränken
$ git diff --diff-filter=MRC            (1)
$ git diff --name-status                (2)
$ git diff arch/i386 include/asm-i386   (3)
  1. Zeigt nur die Änderung, Umbenennung und Kopie, aber keine Löschung oder Hinzufügung.

  2. Zeigt nur Namen und die Art der Änderung, nicht aber die tatsächliche Ausgabe von diff.

  3. Schränkt den Vergleich auf das benannte Unterverzeichnis ein.

Manipulation (munging) der diff-Ausgabe
$ git diff --find-copies-harder -B -C  (1)
$ git diff -R                          (2)
  1. Führt weitere Iterationen durch um Umbenennungen, Kopien und komplett neugeschriebene Teile zu finden (sehr zeitaufwendig!).

  2. Ausgabe in umgekehrter Reihenfolge.

GIT

Teil der git[1] Suite

scroll-to-top