Die einfache Antwort auf die einfache Frage ist git stash apply
Überprüfen Sie einfach den Zweig, in dem Sie Ihre Änderungen vornehmen möchten, und dann git stash apply
. Dann benutze git diff
um das Ergebnis zu sehen.
Nachdem Sie mit Ihren Änderungen fertig sind – die apply
sieht gut aus und du bist dir sicher, dass du den Vorrat nicht mehr brauchst—dann verwenden git stash drop
es loswerden.
Ich empfehle immer die Verwendung git stash apply
eher, als git stash pop
. Der Unterschied ist das apply
lässt den Vorrat herum, um ihn einfach erneut auszuprobieren apply
oder zum Anschauen usw. Wenn pop
in der Lage ist, das Versteck zu extrahieren, wird es sofort auch drop
es, und wenn Sie nachträglich feststellen, dass Sie es woanders (in einem anderen Zweig) oder mit extrahieren wollten --index
, oder so, das ist nicht so einfach. Wenn du apply
, Sie entscheiden, wann drop
.
Es ist jedoch alles ziemlich unbedeutend, und für einen Git-Neuling sollte es ungefähr gleich sein. (Und Sie können den Rest davon überspringen!)
Was ist, wenn Sie fortgeschrittenere oder kompliziertere Sachen machen?
Es gibt sozusagen mindestens drei oder vier verschiedene “Möglichkeiten, Git Stash zu verwenden”. Das Obige gilt 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 vorgenommen haben. Sie möchten einfach die Änderungen übernehmen, die Sie jetzt haben, und sie in einen anderen Zweig “verschieben”.
Dies ist der oben beschriebene einfache Fall. Laufen git stash save
(oder schlicht git stash
, gleiche Sache). Schauen Sie sich den anderen Zweig an und verwenden Sie ihn git stash apply
. Dies bringt Git dazu, Ihre früheren Änderungen einzufügen, indem es den ziemlich leistungsfähigen Zusammenführungsmechanismus von Git verwendet. Überprüfen Sie die Ergebnisse sorgfältig (mit git diff
), um zu sehen, ob sie Ihnen gefallen, und wenn ja, verwenden Sie sie git stash drop
um den Vorrat fallen zu lassen. Du bist fertig!
- Sie haben einige Änderungen gestartet und gespeichert. Dann wechselten Sie zu einem anderen Zweig und begannen mit weiteren Änderungen, wobei Sie vergaßen, dass Sie die gespeicherten Änderungen hatten.
Jetzt wollen Sie behalten oder sogar umziehen, diese Änderungen, und Wenden Sie auch Ihren Vorrat an.
Sie können in der Tat git stash save
wieder, wie git stash
macht einen “Stapel” von Änderungen. Wenn Sie das tun, haben Sie zwei Verstecke, von denen eines gerade aufgerufen wurde stash
– Du kannst aber auch schreiben stash@{0}
– und eine buchstabiert stash@{1}
. Verwenden git stash list
(jederzeit), um sie alle zu sehen. Die neueste ist immer die niedrigste Nummer. Wenn du git stash drop
es lässt das neueste fallen, und das, was war stash@{1}
bewegt sich an die Spitze des Stapels. Wenn Sie hatten, noch mehr, das war stash@{2}
wird stash@{1}
und so weiter.
Du kannst apply
und dann drop
auch ein bestimmtes Versteck: git stash apply stash@{2}
, und so weiter. Das Ablegen eines bestimmten Stashs nummeriert nur die mit den höheren Nummern neu. Auch hier ist das eine ohne Nummer stash@{0}
.
Wenn Sie viele Verstecke anhäufen, kann es ziemlich unordentlich werden (war das Versteck, das ich wollte stash@{7}
oder war es stash@{4}
? Warte, ich habe gerade einen anderen geschoben, jetzt sind es 8 und 5?). Ich persönlich ziehe es vor, diese Änderungen auf einen neuen Zweig zu übertragen, da Zweige Namen haben und cleanup-attempt-in-December
bedeutet mir viel mehr als stash@{12}
. (Die git stash
Der Befehl nimmt eine optionale Speichernachricht entgegen, und diese können helfen, aber irgendwie enden alle meine Stashes mit dem Namen WIP on branch
.)
-
(Extra-Fortgeschrittene) Sie haben verwendet git stash save -p
oder vorsichtig git add
-ed und/oder git rm
-ed bestimmte Bits Ihres Codes vor der Ausführung git stash save
. Sie hatten eine Version im Stash-Index/Staging-Bereich und eine andere (andere) Version im Arbeitsbaum. Das alles wollen Sie bewahren. Also benutzt du jetzt 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 begangen wird”. Dies geht über den Rahmen dieser Antwort hinaus; siehe stattdessen diese andere StackOverflow-Antwort.
Für komplizierte Fälle empfehle ich, zuerst in einem “sauberen” Arbeitsbaum zu beginnen, indem Sie alle Änderungen, die Sie jetzt haben, festschreiben (auf einem neuen Zweig, wenn Sie möchten). Auf diese Weise enthält das “irgendwo”, auf das Sie sie anwenden, nichts anderes, und Sie probieren nur die gespeicherten Änderungen aus:
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 geht es vielleicht eher so:
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create a new branch for "apply"
git stash apply # apply stashed changes; see below about --index
Die Hauptsache, an die Sie sich erinnern sollten, ist, dass der “Stash” ist ein Commit, es ist nur ein leicht “lustiger/seltsamer” Commit, der nicht “auf einem Zweig” ist. Die apply
operation sieht sich an, was der Commit geändert hat, und versucht, ihn zu wiederholen, wo immer Sie sich gerade befinden. Der Vorrat wird immer noch da sein (apply
hält es in der Nähe), damit Sie es sich genauer ansehen oder entscheiden können, dass dies der falsche Ort war apply
es und versuchen Sie es erneut anders, oder was auch immer.
Jedes Mal, wenn Sie einen Vorrat haben, können Sie ihn verwenden git stash show -p
, um eine vereinfachte Version dessen anzuzeigen, was sich im Stash befindet. (Diese vereinfachte Version betrachtet nur die Änderungen des “endgültigen Arbeitsbaums”, nicht der gespeicherte Index ändert das --index
separat wiederherstellt.) Der Befehl git stash apply
ohne --index
versucht nur, diese zu machen gleich Änderungen in Ihrem Arbeitsbaum jetzt.
Dies gilt auch dann, wenn Sie bereits einige Änderungen vorgenommen haben. Die apply
Der Befehl wendet gerne einen Stash auf a an geändert Arbeitsbaum (oder zumindest zu versuchen, ihn anzuwenden). Sie können zum Beispiel dies 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 „Anwenden“-Reihenfolge auswählen und bestimmte Verstecke auswählen, die in einer bestimmten Reihenfolge angewendet werden sollen. Beachten Sie jedoch, dass Sie jedes Mal, wenn Sie im Grunde eine “Git-Merge” durchführen, und wie in der Merge-Dokumentation gewarnt wird:
Es wird davon abgeraten, Git Merge mit nicht-trivialen, nicht festgeschriebenen Änderungen auszuführen: Obwohl dies möglich ist, kann es Sie in einen Zustand versetzen, aus dem Sie im Falle eines Konflikts nur schwer wieder herauskommen können.
Wenn Sie mit einem sauberen Baum beginnen und mache gerade mehrere git apply
Operationen ist es einfach, sich zurückzuziehen: use git reset --hard
um zum sauberen Zustand zurückzukehren und Ihren zu ändern apply
Operationen. (Deshalb empfehle ich für diese komplizierten Fälle, zuerst in einem sauberen Arbeitsbaum zu beginnen.)
Was ist mit dem allerschlimmsten Fall?
Nehmen wir an, Sie machen viel fortgeschrittenes Git-Zeug, und Sie haben einen Vorrat angelegt und möchten dies tun git stash apply --index
aber es ist nicht mehr möglich, das gespeicherte Stash mit anzuwenden --index
weil der Zweig seit dem Speichern zu stark auseinandergegangen ist.
Das ist was git stash branch
ist für.
Wenn du:
- Probier das aus genau begehen Du warst dabei, als du das Original gemacht hast
stash
dann
- Erstellen Sie einen neuen Zweig, und schließlich
git stash apply --index
der Versuch, die Änderungen definitiv neu zu erstellen Wille Arbeit. Das ist was git stash branch newbranch
tut. (Und es lässt dann das Stash fallen, da es erfolgreich angewendet wurde.)
Einige abschließende Worte zu --index
(was zum Teufel ist das?)
Was zum --index
ist einfach zu erklären, aber intern etwas kompliziert:
- Wenn Sie Änderungen haben, müssen Sie
git add
(oder “inszenieren”) sie vorher commit
-ing.
- Also, wenn Sie liefen
git stash
Sie könnte habe beide Dateien bearbeitet foo
und zorg
aber nur eine davon inszeniert.
- Wenn Sie also darum bitten, das Versteck zurückzubekommen, könnte es nett sein, wenn es so wäre
git add
ist die added
Dinge und Taten nicht git add
die nicht hinzugefügten Dinge. Das heißt, wenn Sie es sind add
-ed foo
aber nicht zorg
zurück, bevor Sie das taten stash
, es könnte schön sein, genau das gleiche Setup zu haben. Was inszeniert wurde, soll wieder inszeniert werden; was modifiziert, aber nicht inszeniert wurde, soll wieder modifiziert, aber nicht inszeniert werden.
Die --index
Flagge zu apply
versucht, die Dinge so einzurichten. Wenn Ihr Arbeitsbaum sauber ist, funktioniert dies normalerweise einfach. Wenn Ihr Arbeitsbaum bereits Sachen hat add
-ed können Sie jedoch sehen, dass hier einige Probleme auftreten können. Wenn Sie weglassen --index
der apply
Der Vorgang versucht nicht, die gesamte bereitgestellte/nicht bereitgestellte Einrichtung beizubehalten. Stattdessen ruft es einfach die Merge-Maschinerie von Git auf, indem es den Arbeitsbaum-Commit in der „Stash Bag“ verwendet. Wenn es Ihnen egal ist, inszeniert / nicht inszeniert zu bleiben, lassen Sie es weg --index
macht es viel einfacher für git stash apply
sein Ding zu machen.
hast du es mal mit ‘stash pop’ versucht?
– Robert
25. September 2013 um 10:58 Uhr
Nein. Eigentlich bin ich neu bei git. Da ich nicht alle Befehle vollständig kenne, habe ich nichts anderes versucht! Ich möchte diese Änderungen nicht verlieren.
– Aswathy P. Krishnan
25. September 2013 um 11:00 Uhr
Wenn Sie die gespeicherten Änderungen nicht verlieren möchten, versuchen Sie es mit „git stash apply“. Dadurch werden die gestashten Änderungen auf Ihren aktuellen Zweig angewendet, während der Stash erhalten bleibt. Wenn alles in Ordnung ist, können Sie nach dem Anwenden des Stashs den Stash mit ‘git stash drop’ löschen.
– Robert
25. September 2013 um 11:03 Uhr
@robert Vielen Dank für die einfache Antwort im Vergleich zu der schrecklich komplizierten (für einen Neuling) akzeptierten Antwort.
– Saheel Godhane
3. März 2014 um 15:52 Uhr