Was ist der Unterschied zwischen 'git format-patch' und 'git diff'?

92

Ich sehe keinen Unterschied zwischen der Ausgabe von 'git format-patch' und 'git diff'. Gibt es einen? Und kann ich nicht 'git diff' verwenden, um einen Patch zu erstellen und ihn dann mit git apply anzuwenden?

Mein Problem ist, dass ich Änderungen zum Index hinzugefügt habe, aber anscheinend akzeptiert git format-patch nur Commits. Wenn ich also die Ausgabe von diff verwenden kann, kann ich diesen Befehl verwenden, um einen Patch für die Änderungen im Index zu erstellen:

git diff --cached > index.patch
Rafid
quelle

Antworten:

129

Ein mit erstellter Patch enthält git format-patchauch einige Metainformationen zum Commit (Committer, Datum, Commit-Nachricht, ...) und enthält verschiedene Binärdaten. Alles wird als Mail formatiert, damit es einfach gesendet werden kann. Die Person, die es erhält, kann dann das entsprechende Commit mit neu erstellen, git amund alle Metadaten sind intakt. Es kann auch angewendet werden, git applyda es sich um eine Supermenge eines einfachen Diff handelt.

Ein Patch, mit dem git diffeine Kiste erstellt wurde , ist ein einfacher Unterschied zum Kontext (denken Sie diff -u). Es kann auch mit angewendet werden, git applyaber die Metadaten werden nicht neu erstellt (da sie nicht vorhanden sind).

Zusammenfassend git format-patchist es nützlich, ein Commit zu übertragen, während git diffes nützlich ist, einen Unterschied zwischen zwei Bäumen zu erhalten.

Sylvain Defresne
quelle
12

Aus den Handbüchern bereitet git-format-patch Patches vor, die für die E-Mail -Übermittlung geeignet sind, während git-diff Änderungen anzeigt.

Sie sind zwei verschiedene Dinge und haben unterschiedliche Zwecke. Sie geben einfach ein Patch-Format aus. Aber git-format-patchfügt Daten über ein commit (Datum, Autor, Commit - Nachricht) und bündelt sie in ein Format, die für das Senden als Unix - Mail - Nachricht geeignet ist (obwohl dies sind nur Dateien, so können sie auf andere Methoden gesendet werden und nach wie vor angewandt durch git-am).

Auch git-format-patcherzeugt eine Patch - Datei für jeden im Bereich verpflichten , die Sie angeben. Diese Änderungen werden als Commits zu Ihrem Repository mit hinzugefügt git-am.

git-diffZeigt nur den Unterschied zwischen den beiden von Ihnen angeforderten Zuständen an und kann zum Erstellen einer Patch-Datei verwendet werden. Dies ist jedoch nur eine normale Patch-Datei. Durch Anwenden des Patches wird lediglich der Status des Arbeitsverzeichnisses geändert.

Und ja, auf diese Weise können Sie einen Patch für Ihren Index erstellen.

Abizern
quelle
Vielen Dank. Was ist das Besondere an UNIX Mail, damit der Patch darauf basiert?
Rafid
7
Es gibt nichts wirklich Besonderes. Dies ist nur das Git von Linus Torvalds, dessen Workflow das Senden und Empfangen von Patches per E-Mail zur Validierung vor der Integration in den Linux-Kernel umfasste.
Sylvain Defresne
Git wurde von Linus Torvalds entwickelt, um den Linux-Kernel beizubehalten. Unix-Mail war ein gängiges Format.
Abizern
1

Die Patch-Datei kann mit dem git diffBefehl generiert werden. Im Vergleich zu dem durch den git format-patchBefehl generierten Patch sind die Hauptunterschiede jedoch:

  1. Keine Metadaten zu einem Commit (wie Datum, Autor, Commit-Nachricht usw.);
  2. Keine Statistiken über das Diff (diffstat, z. B. geänderte x-Dateien, y-Einfügungen (+), z-Löschungen (-));
  3. Keine binären Unterschiede, nur Textunterschiede.

Geben Sie hier die Bildbeschreibung ein

So generieren Sie die Patch-Datei für alle geänderten Dateien (im Index oder im Arbeitsverzeichnis):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

So wenden Sie die generierte Patch-Datei an:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
K. Symbol
quelle