Ich habe einen kleinen Patch in meinem Git-Vorrat gespeichert. Ich habe es mit auf meine Arbeitskopie angewendet git stash apply
. Jetzt möchte ich diese Änderungen rückgängig machen, indem ich den Patch rückwärts anwende (ähnlich wie git revert
bei dem Stash).
Weiß jemand, wie man das macht?
Klarstellung: Es gibt andere Änderungen in meiner Arbeitskopie. Mein spezieller Fall ist schwer zu beschreiben, aber Sie können sich Debugging oder experimentellen Code vorstellen, der sich im Vorrat befindet. Jetzt ist es in meiner Arbeitskopie mit einigen anderen Änderungen gemischt und ich möchte den Effekt mit und ohne die Änderungen aus dem Vorrat sehen.
Es sieht nicht so aus, als ob Stash dies derzeit unterstützt, aber ein git stash apply --reverse
wäre eine nette Funktion.
Antworten:
Laut der git-stash-Manpage wird "Ein Stash als Commit dargestellt, dessen Baum den Status des Arbeitsverzeichnisses aufzeichnet, und sein erstes übergeordnetes
HEAD
Element ist das Commit zum Zeitpunkt der Erstellung des Stashs" undgit stash show -p
gibt uns die im Versteck als Unterschied zwischen dem Versteckzustand und seinem ursprünglichen Elternteil.Verwenden Sie
git stash show -p | patch --reverse
wie folgt, um Ihre anderen Änderungen beizubehalten :Bearbeiten:
Eine leichte Verbesserung ist die Verwendung
git apply
anstelle des Patches:Alternativ können Sie auch
git apply -R
als Abkürzung für verwendengit apply --reverse
.Ich fand das in letzter Zeit sehr praktisch ...
quelle
git apply -R
ist eine Verbesserung, zumindest für mich auf meiner Windows-Box mit Git Bash, da ichpatch --reverse
Probleme hatte, die zu patchende Datei zu finden (kein wirklicher Hinweis, warum die Alternative funktioniert hat). +1 und gute Erklärung--index
wie diesegit stash show -p | git apply --reverse --index
. Da Sie die zurückgesetzten Änderungen nicht mehr im Index hinzufügen müssen.git stash show -p | git apply -R -v
mit der folgenden Meldung ausgeführt habe :Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1
. Wissen Sie, was falsch sein könnte?git stash
[save]
Nimmt Ihren Arbeitsverzeichnisstatus und Ihren Indexstatus und verwahrt sie, wodurch Index und Arbeitsbereich aufHEAD
Version gesetzt werden.git stash apply
bringt diese Änderungen zurück,git reset --hard
würde sie also wieder entfernen.git stash pop
Bringt diese Änderungen zurück und entfernt die obersten versteckten Änderungen.git stash [save]
In diesem Fall würde der vorherige Status (Pre-Pop) wiederhergestellt.quelle
entfernt alle nicht festgeschriebenen Änderungen.
quelle
Die V1-Git-Manpage enthielt einen Verweis zum Aufheben der Anwendung eines Stashs. Der Auszug ist unten.
Die neuere V2- Git-Manpage enthält keinen Hinweis darauf, dass ein Stash nicht angewendet wird, aber das Folgende funktioniert immer noch gut
Aufheben der Anwendung eines Stashs In einigen Anwendungsszenarien möchten Sie möglicherweise versteckte Änderungen anwenden, einige Arbeiten ausführen und dann die ursprünglich aus dem Stash stammenden Änderungen aufheben. Git bietet keinen solchen Befehl zum Aufheben der Anwendung des Stashs, aber es ist möglich, den Effekt zu erzielen, indem Sie einfach den mit einem Stash verknüpften Patch abrufen und ihn umgekehrt anwenden:
Wenn Sie keinen Stash angeben, geht Git von dem neuesten Stash aus:
Möglicherweise möchten Sie einen Alias erstellen und Ihrem Git effektiv einen Stash-Unapply-Befehl hinzufügen. Beispielsweise:
quelle
Dies ist längst überfällig, aber wenn ich das Problem richtig interpretiere, habe ich eine einfache Lösung gefunden. Beachten Sie, dass dies eine Erklärung in meiner eigenen Terminologie ist:
git stash [save]
speichert aktuelle Änderungen und versetzt Ihren aktuellen Zweig in den "sauberen Zustand"git stash list
gibt so etwas wie:stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
stellt den aktuellen Zweig wie zuvor einstash [save]
git checkout .
Setzt den aktuellen Zweig wie folgtstash [save]
Der im Stash gespeicherte Code geht nicht verloren, er kann von
git apply stash@{0}
wieder gefunden werden .Wie auch immer, das hat bei mir funktioniert!
quelle
git stash apply --reverse
und bin dann einfach zurückgegangen,git stash apply stash@{x}
wie Sie es erwähnt haben. Arbeitete ohne Probleme.Abgesehen von dem, was andere erwähnt haben, ist der einfachste Weg, zuerst zu tun
und dann alle lokalen Änderungen auschecken
quelle
Zusätzlich zur Antwort von @Greg Bacon, falls Binärdateien zum Index hinzugefügt wurden und Teil des Stashs mit waren
Kann dazu führen, dass
Das Hinzufügen
--binary
behebt das Problem, hat aber leider noch nicht herausgefunden, warum.quelle
Dies ist zusätzlich zu den obigen Antworten, fügt jedoch die Suche nach dem Git-Stash basierend auf der Nachricht hinzu, da sich die Stash-Nummer ändern kann, wenn neue Stashes gespeichert werden. Ich habe ein paar Bash-Funktionen geschrieben:
$ git stash save "my stash"
$ apply "my stash"
$ remove "my stash"
quelle
Sie können dem Bild folgen, das ich freigegeben habe, um es zu entfernen, wenn Sie versehentlich auf das Speichern getippt haben.
quelle