Wie kann ich Patches mit dem formatieren, was ich verstaut habe?

140

In git verstecke ich meine Änderungen. Ist es möglich, dass ich mit dem, was ich verstaut habe, einen Patch erstellen kann? Und dann diesen Patch in einem anderen Repository (dem meines Kollegen) anwenden?

ich weiß git format-patch -1 , aber ich denke, dass es für das ist, was ich begangen habe. Aber ich suche das Gleiche für Änderungen, die ich versteckt habe.

Und wie kann ich einen Patch in einem anderen Repository anwenden?

Silverburgh
quelle

Antworten:

155

Sicher, git stash showunterstützt dies:

git stash show -p

Also, benutze

git stash list

Um dann die Nummer des Stashs herauszufinden, den Sie als Patch exportieren möchten

git stash show -p stash@{<number>} > <name>.patch

um es zu exportieren.

Beispielsweise:

git stash show -p stash@{3} > third_stash.patch
Greg Hewgill
quelle
1
Ich habe eine verwandte Frage zum Anwenden eines Patches. Angenommen, mein Patch berührt mehrere Dateien. Gibt es eine Möglichkeit, den Patch "interaktiv" anzuwenden? Wählen Sie aus, auf welche Dateien des Patches ich den Patch anwenden möchte. Kann ich das machen?
Silverburgh
1
@silverburgh: Ich habe mich kurz umgesehen man patchund keine Optionen für interaktive Patch-Anwendungen gesehen. Da Patch-Dateien selbst reine Textdateien sind, wird der Patch normalerweise in einem Texteditor bearbeitet, um die relevanten Teile auszuschneiden, mit denen angewendet werden soll patch. Wenn Sie den Patch auf ein anderes Git-Repository anwenden, können Sie alternativ alles anwenden und dann selektiv git checkoutDateien, die Sie nicht ändern möchten ( git checkoutmit einem Dateinamen werden nicht bereitgestellte Änderungen verworfen).
Greg Hewgill
1
@silverburgh Sie können den Satz von Dateien einschränken, die mit den Parametern "--exclude" und "--include" von git gepatcht wurden.
Kelvin
@silverburgh Sie können Folgendes tun, vorausgesetzt, Sie haben einen Patch. Wenden Sie den Patch vollständig an und tun git add --interactive ${YOUR_FILES}Sie dies dann. Dadurch haben Sie die Möglichkeit, sich teilweise zu verpflichten.
Alex
15
Vielen Dank. Das hat bei mir funktioniert:git stash show -p stash@{1} > patch.txt
Ryan
63

Diese Antwort enthält Informationen zum Speichern und Anwenden des Patches an der Stelle, an der Sie ihn verwenden möchten.

So speichern Sie die Ausgabe in einer Datei:

 git stash show -p --color=never > my-patch-name.patch

Überprüfen Sie, ob der Patch gut aussieht:

git apply --stat my-patch-name.patch

Überprüfen Sie keine Fehler:

git apply --check my-patch-name.patch

Wenden Sie den Patch an

git apply my-patch-name.patch
Calvinf
quelle
Dieser arbeitete für mich mit einfachen Textcodedateien, aber ich musste Leerzeichen berücksichtigen. Überprüfen Sie, ob der Patch gut aussieht: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch Wenden Sie den Patch an: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Craig Boland
Schöne und prägnante Erklärung. Damit es funktionierte, musste ich beim Anwenden des Patches im Repo-Stamm sein, sonst git applyhabe ich das Diff nicht aufgenommen.
Max
16

Verwenden

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

um eine Liste Ihrer kürzlich verstauten Sachen zu bekommen. Git erstellt tatsächlich Commit-Objekte, wenn Sie diese verstecken.

Sie sind Commits wie alles andere. Sie können sie in einer Filiale auschecken:

$> git checkout -b with_stash stash@{0}

Sie können diesen Zweig dann veröffentlichen und Ihr Kollege kann dieses Commit zusammenführen oder auswählen.

Peritus
quelle
13

Die oben genannten Lösungen funktionieren nicht für Binärdaten. Folgendes fügt Unterstützung dafür hinzu:

git stash show stash@{0} -p --binary

Bearbeiten

Hinweis: Ich wollte den obigen Antworten nur einen Kommentar hinzufügen, aber mein Ruf reicht nicht aus.

Davide Guerri
quelle
3

Ich glaube, dies könnte eines der Udpates von Git in letzter Zeit sein. Sie müssen die Änderungen, die Sie gespeichert haben, nicht mehr patchen. Sie können Ihre versteckten Änderungen einfach auf einen Zweig auf einen anderen anwenden.

Sagen Sie in Zweig A, dass Sie einige Änderungen gespeichert haben, die als stash @ {1} bezeichnet werden.

Sie wechseln jetzt zu Zweig B. Sie können einfach Folgendes tun:

$git stash apply stash@{1}

Dadurch wird Ihr Zweig A auf Zweig B geändert.

Stucash
quelle