Angenommen, ich habe nicht festgeschriebene Änderungen in meinem Arbeitsverzeichnis. Wie kann ich aus diesen einen Patch erstellen, ohne ein Commit erstellen zu müssen?
Angenommen, ich habe nicht festgeschriebene Änderungen in meinem Arbeitsverzeichnis. Wie kann ich aus diesen einen Patch erstellen, ohne ein Commit erstellen zu müssen?
Antworten:
git diff
für nicht inszenierte Änderungen. git diff --cached
für inszenierte Änderungen.
git format-patch
Enthält auch binäre Unterschiede und einige Meta-Informationen. Eigentlich wäre das die beste Wahl, um einen Patch zu erstellen, aber afaik funktioniert dies nur für eingecheckte Quellen / Änderungen, oder?
git diff --relative
Wenn Sie die Änderungen noch nicht festgeschrieben haben, dann:
git diff > mypatch.patch
Aber manchmal kommt es vor, dass ein Teil der Dinge, die Sie tun, neue Dateien sind, die nicht verfolgt werden und nicht in Ihrer git diff
Ausgabe enthalten sind. Eine Möglichkeit, einen Patch zu git add
erstellen, besteht darin, alles für ein neues Commit ( jede Datei oder nur git add .
) bereitzustellen, aber das Commit nicht durchzuführen, und dann:
git diff --cached > mypatch.patch
Fügen Sie die Option 'binär' hinzu, wenn Sie dem Patch Binärdateien hinzufügen möchten (z. B. MP3-Dateien):
git diff --cached --binary > mypatch.patch
Sie können den Patch später anwenden:
git apply mypatch.patch
Hinweis: Sie können auch --staged
als Synonym für verwenden --cached
.
git diff --no-color
. Ansonsten sieht es nach einem Codierungsproblem aus.
git diff
und git apply
funktioniert für Textdateien, aber nicht für Binärdateien.
Sie können problemlos einen vollständigen binären Patch erstellen, müssen jedoch ein temporäres Commit erstellen. Sobald Sie Ihre temporären Commits vorgenommen haben, können Sie den Patch erstellen mit:
git format-patch <options...>
Führen Sie nach dem Erstellen des Patches den folgenden Befehl aus:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Dadurch werden Ihre temporären Commits zurückgesetzt. Das Endergebnis lässt Ihre Arbeitskopie (absichtlich) mit denselben Änderungen verschmutzen, die Sie ursprünglich hatten.
Auf der Empfangsseite können Sie den gleichen Trick verwenden, um die Änderungen auf die Arbeitskopie anzuwenden, ohne über den Commit-Verlauf zu verfügen. Wenden Sie einfach die Patches an und git reset --mixed <SHA of commit *before* the patches>
.
Beachten Sie, dass Sie möglicherweise gut synchronisiert sein müssen, damit diese gesamte Option funktioniert. Ich habe einige Fehler beim Anwenden von Patches gesehen, als die Person, die sie erstellt hat, nicht so viele Änderungen vorgenommen hat wie ich. Es gibt wahrscheinlich Möglichkeiten, es zum Laufen zu bringen, aber ich habe mich nicht weit damit befasst.
So erstellen Sie dieselben Patches in Tortoise Git (nicht, dass ich die Verwendung dieses Tools empfehle):
Tortoise Git
->Create Patch Serial
Since
: FETCH_HEAD
funktioniert, wenn Sie gut synchronisiert sind)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
OptionUnd wie man sie anwendet:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
OptionSo erstellen Sie einen Patch mit geänderten und neuen Dateien (bereitgestellt):
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
nicht.
file_name.patch
der patch
Befehl verwendet werden? Sind sie miteinander kompatibel?
Ich mag:
git format-patch HEAD~<N>
Wo <N>
ist die Anzahl der letzten Commits, die als Patches gespeichert werden sollen?
Einzelheiten zur Verwendung des Befehls finden Sie im DOC
UPD
Hier finden Sie, wie Sie sie dann anwenden können.
UPD Für diejenigen, die nicht auf die Idee gekommen sind, format-patch
Alias hinzuzufügen:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
Führen Sie dann in einem beliebigen Verzeichnis Ihres Projekt-Repositorys Folgendes aus:
git make-patch
Dieser Befehl wird 0001-uncommited.patch
in Ihrem aktuellen Verzeichnis erstellt. Der Patch enthält alle Änderungen und nicht verfolgten Dateien, die für den nächsten Befehl sichtbar sind:
git status .
Wir könnten auch die Dateien angeben, um nur die Dateien mit relativen Änderungen einzuschließen, insbesondere wenn sie sich über mehrere Verzeichnisse erstrecken, z
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
Ich fand, dass dies nicht in den Antworten oder Kommentaren angegeben ist, die alle relevant und korrekt sind. Deshalb habe ich beschlossen, es hinzuzufügen. Explizit ist besser als implizit!