Die einfache Antwort auf die einfache Frage lautet git stash apply
Überprüfen Sie einfach den Zweig, in dem Sie Ihre Änderungen vornehmen möchten, und dann git stash apply
. Verwenden Sie dann git diff
, um das Ergebnis zu sehen.
Nachdem Sie alle mit Ihren Änderungen am bist apply
sieht gut aus und Sie sind sicher , brauchen Sie nicht das Versteck jeder mehr- dann verwendet git stash drop
es loszuwerden.
Ich schlage immer vor, git stash apply
anstatt zu verwenden git stash pop
. Der Unterschied besteht darin, dass apply
der Vorrat zum einfachen erneuten Ausprobieren apply
oder zum Betrachten usw. pop
verbleibt . Wenn der Vorrat extrahiert werden kann, wird er sofort auch drop
angezeigt, und wenn Sie plötzlich feststellen, dass Sie ihn irgendwo extrahieren möchten sonst (in einem anderen Zweig) oder mit --index
oder einem solchen ist das nicht so einfach. Wenn Sie apply
, können Sie wählen, wann drop
.
Es ist alles auf die eine oder andere Weise ziemlich klein, und für einen Neuling sollte es ungefähr gleich sein. (Und den Rest kannst du überspringen!)
Was ist, wenn Sie fortgeschrittenere oder kompliziertere Dinge tun?
Es gibt mindestens drei oder vier verschiedene "Möglichkeiten, Git Stash zu verwenden". Das Obige ist für "Weg 1", den "einfachen Weg":
Sie haben mit einem sauberen Zweig begonnen, an einigen Änderungen gearbeitet und dann festgestellt, dass Sie sie im falschen Zweig durchgeführt haben. Sie möchten nur die Änderungen, die Sie jetzt haben, in einen anderen Zweig "verschieben".
Dies ist der oben beschriebene einfache Fall. Laufen Sie git stash save
(oder einfach git stash
, dasselbe). Schauen Sie sich den anderen Zweig an und verwenden Sie git stash apply
. Dadurch wird git in Ihren früheren Änderungen zusammengeführt, wobei der ziemlich leistungsstarke Zusammenführungsmechanismus von git verwendet wird. Überprüfen Sie die Ergebnisse sorgfältig (mit git diff
), um festzustellen , ob sie Ihnen gefallen, und verwenden Sie sie gegebenenfalls, git stash drop
um den Vorrat fallen zu lassen. Du bist fertig!
Sie haben einige Änderungen vorgenommen und sie gespeichert. Dann haben Sie zu einem anderen Zweig gewechselt und weitere Änderungen vorgenommen, wobei Sie vergessen haben, dass Sie die versteckten hatten.
Jetzt möchten Sie diese Änderungen beibehalten oder sogar verschieben und auch Ihren Vorrat anwenden.
Sie können in der Tat git stash save
wieder, wie git stash
ein "Stapel" von Änderungen vornimmt. Wenn Sie das tun, haben Sie zwei Verstecke, einen, der gerade aufgerufen wurde stash
- aber Sie können auch schreiben stash@{0}
- und einen, der geschrieben ist stash@{1}
. Verwenden Sie git stash list
(jederzeit), um sie alle zu sehen. Das neueste ist immer das niedrigste. Wenn Sie git stash drop
, lässt es das neueste und dasjenige fallen, stash@{1}
das an die Spitze des Stapels verschoben wurde. Wenn Sie noch mehr hatten, dass derjenige war stash@{2}
wird stash@{1}
, und so weiter.
Sie können apply
und dann auch drop
einen bestimmten Vorrat: git stash apply stash@{2}
und so weiter. Wenn Sie einen bestimmten Vorrat löschen, werden nur die höher nummerierten neu nummeriert. Auch hier ist der ohne Nummer stash@{0}
.
Wenn Sie viele Verstecke aufstapeln, kann es ziemlich chaotisch werden (war das Versteck, das ich wollte stash@{7}
oder war es stash@{4}
? Warten Sie, ich habe gerade ein anderes geschoben, jetzt sind es 8 und 5?). Ich persönlich ziehe es vor, diese Änderungen in eine neue Niederlassung zu übertragen, da Niederlassungen Namen haben und cleanup-attempt-in-December
mir viel mehr bedeuten als stash@{12}
. (Der git stash
Befehl nimmt eine optionale Speichernachricht entgegen, und diese können helfen, aber irgendwie werden alle meine Verstecke nur mit Namen benannt WIP on branch
.)
(Extra-Advanced) Sie haben vor der Ausführung bestimmte Teile Ihres Codes verwendet git stash save -p
oder sorgfältig git add
bearbeitet und / oder git rm
bearbeitet git stash save
. Sie hatten eine Version im versteckten Index- / Staging-Bereich und eine andere (andere) Version im Arbeitsbaum. Sie wollen das alles bewahren. Jetzt verwenden Sie also git stash apply --index
, und das schlägt manchmal fehl mit:
Conflicts in index. Try without --index.
Sie verwenden, git stash save --keep-index
um zu testen, "was festgeschrieben wird". Dieser geht über den Rahmen dieser Antwort hinaus; Siehe stattdessen diese andere StackOverflow-Antwort .
In komplizierten Fällen empfehle ich, zuerst in einem "sauberen" Arbeitsverzeichnis zu beginnen, indem Sie alle Änderungen übernehmen, die Sie jetzt haben (in einem neuen Zweig, wenn Sie möchten). Auf diese Weise enthält das "irgendwo", auf das Sie sie anwenden, nichts anderes, und Sie werden nur die versteckten Änderungen ausprobieren:
git status # see if there's anything you need to commit
# uh oh, there is - let's put it on a new temp branch
git checkout -b temp # create new temp branch to save stuff
git add ... # add (and/or remove) stuff as needed
git commit # save first set of changes
Jetzt sind Sie an einem "sauberen" Ausgangspunkt. Oder vielleicht geht es eher so:
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create new branch for "apply"
git stash apply # apply stashed changes; see below about --index
Die wichtigste Sache zu erinnern ist , dass die „Stash“ ist ein begehen, es ist nur ein wenig „komisch / seltsam“ begeht das ist nicht „auf einem Zweig“. Die apply
Operation überprüft, was das Commit geändert hat, und versucht, es zu wiederholen, wo immer Sie sich gerade befinden. Das Versteck ist immer noch da ( apply
behält es bei sich), sodass Sie es sich genauer ansehen oder entscheiden können, dass dies der falsche Ort war, apply
und es erneut versuchen können, oder was auch immer.
Jedes Mal, wenn Sie einen Vorrat haben, können Sie git stash show -p
eine vereinfachte Version des Vorrats sehen. (Diese vereinfachte Version betrachtet nur die Änderungen des "endgültigen Arbeitsbaums", nicht die gespeicherten Indexänderungen, --index
die separat wiederhergestellt werden.) Der Befehl git stash apply
ohne --index
versucht nur, dieselben Änderungen jetzt in Ihrem Arbeitsverzeichnis vorzunehmen.
Dies gilt auch dann, wenn Sie bereits einige Änderungen vorgenommen haben. Der apply
Befehl wendet gerne einen Stash auf ein geändertes Arbeitsverzeichnis an (oder versucht zumindest, ihn anzuwenden). Sie können zum Beispiel Folgendes tun:
git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
Sie können hier die Reihenfolge "Anwenden" auswählen und bestimmte Verstecke auswählen, die in einer bestimmten Reihenfolge angewendet werden sollen. Beachten Sie jedoch, dass jedes Mal, wenn Sie im Grunde genommen eine "Git-Zusammenführung" durchführen, und wie in der Zusammenführungsdokumentation gewarnt wird:
Es wird davon abgeraten, git merge mit nicht trivialen, nicht festgeschriebenen Änderungen auszuführen: Obwohl dies möglich ist, befinden Sie sich möglicherweise in einem Zustand, aus dem Sie im Falle eines Konflikts nur schwer herauskommen können.
Wenn Sie mit einem sauberen Verzeichnis beginnen und nur mehrere git apply
Vorgänge ausführen, ist das Zurücksetzen einfach: Verwenden Sie git reset --hard
diese Option, um zum sauberen Status zurückzukehren und Ihre apply
Vorgänge zu ändern . (Deshalb empfehle ich für diese komplizierten Fälle, zuerst in einem sauberen Arbeitsverzeichnis zu beginnen.)
Was ist mit dem schlimmsten Fall?
Nehmen wir an, Sie machen viel fortgeschrittenes Git-Zeug und haben einen Stash erstellt und möchten dies git stash apply --index
, aber es ist nicht mehr möglich, den gespeicherten Stash mit anzuwenden --index
, da der Zweig seit dem Speichern zu stark auseinander gegangen ist.
Dafür ist da git stash branch
.
Wenn du:
- Überprüfen Sie dann das genaue Commit , bei dem Sie das Original erstellt
stash
haben
- Erstellen Sie einen neuen Zweig und schließlich
git stash apply --index
der Versuch , neu erstellen , um die Änderungen auf jeden Fall wird funktionieren. Das macht es. (Und dann wird der Vorrat gelöscht, da er erfolgreich angewendet wurde.)git stash branch newbranch
Ein --index
paar abschließende Worte über (was zum Teufel ist das?)
Was das --index
macht, ist einfach zu erklären, aber intern etwas kompliziert:
- Wenn Sie Änderungen haben, müssen Sie
git add
diese vor dem commit
Einfügen (oder "inszenieren") .
- Wenn Sie ausgeführt haben
git stash
, haben Sie möglicherweise beide Dateien bearbeitet foo
und zorg
nur eine davon bereitgestellt.
- Wenn Sie also darum bitten, das Versteck zurückzubekommen, ist es möglicherweise hilfreich, wenn es sich um
git add
die add
ed-Dinge handelt und nicht um git add
die nicht hinzugefügten Dinge. Das heißt, wenn Sie add
ed, foo
aber nicht zorg
zurück, bevor Sie das getan haben stash
, könnte es schön sein, genau das gleiche Setup zu haben. Was inszeniert wurde, sollte wieder inszeniert werden; Was geändert, aber nicht inszeniert wurde, sollte erneut geändert, aber nicht inszeniert werden.
Die --index
Flagge, die apply
versucht, die Dinge auf diese Weise einzurichten. Wenn Ihr Arbeitsbaum sauber ist, funktioniert dies normalerweise nur. Wenn Ihr Arbeitsbaum jedoch bereits Daten enthält add
, können Sie hier sehen, wie Probleme auftreten können. Wenn Sie auslassen , --index
versucht der apply
Vorgang nicht, das gesamte bereitgestellte / nicht bereitgestellte Setup beizubehalten. Stattdessen wird nur die Merge-Maschinerie von git aufgerufen, wobei das Work-Tree-Commit im "Stash Bag" verwendet wird . Wenn es Ihnen nicht wichtig ist, inszeniert / nicht inszeniert zu bleiben, --index
macht es das Weglassen viel einfacher git stash apply
, seine Sache zu erledigen.