Ich hatte einige nicht festgeschriebene Änderungen in meinem Entwicklungszweig und habe sie mit versteckt git stash
, aber es gab einige Änderungen, die unter diesen versteckten sehr wichtig waren. Gibt es eine Möglichkeit, diese Änderungen zurückzugewinnen?
Außerdem habe ich seitdem einige Änderungen zusätzlich zu den versteckten Codedateien vorgenommen.
Gibt es eine Möglichkeit, die versteckten Änderungen in einem neuen Zweig abzurufen, wenn dies möglich ist?
Antworten:
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 danngit 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 verwendetgit stash drop
es loszuwerden.Ich schlage immer vor,
git stash apply
anstatt zu verwendengit stash pop
. Der Unterschied besteht darin, dassapply
der Vorrat zum einfachen erneuten Ausprobierenapply
oder zum Betrachten usw.pop
verbleibt . Wenn der Vorrat extrahiert werden kann, wird er sofort auchdrop
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 Sieapply
, können Sie wählen, wanndrop
.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 einfachgit stash
, dasselbe). Schauen Sie sich den anderen Zweig an und verwenden Siegit 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 (mitgit 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, wiegit stash
ein "Stapel" von Änderungen vornimmt. Wenn Sie das tun, haben Sie zwei Verstecke, einen, der gerade aufgerufen wurdestash
- aber Sie können auch schreibenstash@{0}
- und einen, der geschrieben iststash@{1}
. Verwenden Siegit stash list
(jederzeit), um sie alle zu sehen. Das neueste ist immer das niedrigste. Wenn Siegit 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 warstash@{2}
wirdstash@{1}
, und so weiter.Sie können
apply
und dann auchdrop
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 Nummerstash@{0}
.Wenn Sie viele Verstecke aufstapeln, kann es ziemlich chaotisch werden (war das Versteck, das ich wollte
stash@{7}
oder war esstash@{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 undcleanup-attempt-in-December
mir viel mehr bedeuten alsstash@{12}
. (Dergit stash
Befehl nimmt eine optionale Speichernachricht entgegen, und diese können helfen, aber irgendwie werden alle meine Verstecke nur mit Namen benanntWIP on branch
.)(Extra-Advanced) Sie haben vor der Ausführung bestimmte Teile Ihres Codes verwendet
git stash save -p
oder sorgfältiggit add
bearbeitet und / odergit rm
bearbeitetgit 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 alsogit stash apply --index
, und das schlägt manchmal fehl mit: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:
Jetzt sind Sie an einem "sauberen" Ausgangspunkt. Oder vielleicht geht es eher so:
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 Befehlgit 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: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:
Wenn Sie mit einem sauberen Verzeichnis beginnen und nur mehrere
git apply
Vorgänge ausführen, ist das Zurücksetzen einfach: Verwenden Siegit reset --hard
diese Option, um zum sauberen Status zurückzukehren und Ihreapply
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:
stash
habengit 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:git add
diese vor demcommit
Einfügen (oder "inszenieren") .git stash
, haben Sie möglicherweise beide Dateien bearbeitetfoo
undzorg
nur eine davon bereitgestellt.git add
dieadd
ed-Dinge handelt und nicht umgit add
die nicht hinzugefügten Dinge. Das heißt, wenn Sieadd
ed,foo
aber nichtzorg
zurück, bevor Sie das getan habenstash
, 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, dieapply
versucht, die Dinge auf diese Weise einzurichten. Wenn Ihr Arbeitsbaum sauber ist, funktioniert dies normalerweise nur. Wenn Ihr Arbeitsbaum jedoch bereits Daten enthältadd
, können Sie hier sehen, wie Probleme auftreten können. Wenn Sie auslassen ,--index
versucht derapply
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 einfachergit stash apply
, seine Sache zu erledigen.quelle
git stash pop
? Oder meinst du: du hast einige Dateien bearbeitet, bist aber noch nichtgit stash
wieder gelaufen ? Oder meinst du etwas ganz anderes?apply
festzuschreiben, bevor Sie einen Stash erstellen. Sie müssen nicht haben , um dies zu tun, aber es macht die Dinge viel einfacher für Sie, zu betrachten. Sie können verwenden,rebase -i
um mehrere Commits zusammenzudrücken oder bestimmte Änderungen oder was auch immer später auszuwählen.git stash apply --index
(erinnere dich an die beiden Striche). Wenn Sie weglassen--index
, keine große Sache; Der einzige Punkt--index
ist, das inszenierte / nicht inszenierte Setup beizubehalten. (Sie hatten wahrscheinlich überhaupt kein spezielles Setup.) Danngit status
usw. und wie gewünscht hinzufügen / festschreiben usw. Wenn (und nur wenn) Sie mit dem Stash fertig sind, verwenden Sie esgit stash drop
, um es zu verwerfen.drop
oderpop
) , um das Versteck, haben Sie immer das Original sicher verstaute Code auf einem Commit, weil ein Versteck ist ein fest! Wenn Sie es genau zurückbekommen möchten, aber in einem Zweig, verwenden Siegit stash branch
(siehe diesen Abschnitt oben oder das Pro Git-Buch in Shunyas Antwort ). Sie können danngit checkout
diesen Zweig odergit cherry-pick
daswird alles wieder in Position bringen
Wie in den Kommentaren vorgeschlagen, können Sie
git stash branch newbranch
den Stash auf einen neuen Zweig anwenden. Dies entspricht dem Ausführen von:quelle
git stash branch newbranch
werde das in der Tat tun; Beachten Sie jedoch, dass der neue Zweig mit dem übergeordneten Zweig erstellt wird, der auf das Commit festgelegt ist, dasHEAD
zum Zeitpunkt derstash
Ausführung festgelegt wurde. Mit anderen Worten, es ist für den Fall, dass Sie nach einer langen Hack-Sitzung oder was auch immer zurückkommen, auf das Chaos starren und entscheiden, "Ich hätte das auf einen Ast legen sollen, anstatt es zu verstecken" :-)Um dies zu vereinfachen, haben Sie zwei Möglichkeiten, Ihren Vorrat erneut anzuwenden:
git stash pop
- Stellen Sie den gespeicherten Zustand wieder her, aber der Stash wird aus dem temporären Speicher gelöscht.git stash apply
- Stellen Sie den gespeicherten Zustand wieder her und verlassen Sie die Stash-Liste für eine mögliche spätere Wiederverwendung.In diesem Artikel erfahren Sie mehr über Git-Stashes .
quelle
So überprüfen Sie Ihren Stash-Inhalt: -
Wenden Sie eine bestimmte Stash-Nr. aus der Stash-Liste an: -
oder um nur den ersten Vorrat anzuwenden: -
Hinweis: Git Stash Pop entfernt den Stash aus Ihrer Stash-Liste, während Git Stash nicht angewendet wird. Verwenden Sie sie also entsprechend.
quelle
Auf dem Mac hat das bei mir funktioniert:
git stash list (siehe alle deine stashs)
git stash bewerben (nur die Nummer, die Sie von Ihrer Stash-Liste wollen)
so was:
quelle
Sie können die nicht festgeschriebenen Änderungen mit "git stash" speichern und dann mit "git checkout -b" in einen neuen Zweig auschecken und dann die versteckten Commits "git stash apply" anwenden.
quelle