So stellen Sie gespeicherte, nicht festgeschriebene Änderungen wieder her

Lesezeit: 12 Minuten

So stellen Sie gespeicherte nicht festgeschriebene Anderungen wieder her
Aswathy P. Krishnan

Ich hatte einige nicht festgeschriebene Änderungen in meinem Entwicklungszweig und habe sie mit gespeichert git stash, aber es gab einige Änderungen, die unter diesen versteckten sehr wichtig waren. Gibt es eine Möglichkeit, diese Änderungen rückgängig zu machen?

Außerdem habe ich seitdem einige Änderungen an den versteckten Codedateien vorgenommen.

Besteht die Möglichkeit, dass ich die verstauten Änderungen nach Möglichkeit in einem neuen Zweig abrufen kann?

  • 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

So stellen Sie gespeicherte nicht festgeschriebene Anderungen wieder her
Torek

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 applyoder 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”:

  1. 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!

  1. 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 [email protected]{0}– und eine buchstabiert [email protected]{1}. Verwenden git stash list (jederzeit), um sie alle zu sehen. Die neueste ist immer die niedrigste Nummer. Wenn du git stash dropes lässt das neueste fallen, und das, was war [email protected]{1} bewegt sich an die Spitze des Stapels. Wenn Sie hatten, noch mehr, das war [email protected]{2} wird [email protected]{1}und so weiter.

Du kannst apply und dann drop auch ein bestimmtes Versteck: git stash apply [email protected]{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 [email protected]{0}.

Wenn Sie viele Verstecke anhäufen, kann es ziemlich unordentlich werden (war das Versteck, das ich wollte [email protected]{7} oder war es [email protected]{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 [email protected]{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.)

  1. (Extra-Fortgeschrittene) Sie haben verwendet git stash save -poder 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 --indexund das schlägt manchmal fehl mit:

    Conflicts in index.  Try without --index.
    
  2. 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 applyohne --indexversucht 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 [email protected]{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 --indexaber 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:

  1. Probier das aus genau begehen Du warst dabei, als du das Original gemacht hast stashdann
  2. Erstellen Sie einen neuen Zweig, und schließlich
  3. 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 stashSie könnte habe beide Dateien bearbeitet foo und zorgaber nur eine davon inszeniert.
  • Wenn Sie also darum bitten, das Versteck zurückzubekommen, könnte es nett sein, wenn es so wäre git addist 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 --indexder 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.

  • Ich verstehe deinen Kommentar nicht. Meinst du: du bist gelaufen git stash pop? Oder meinst du: du hast einige Dateien bearbeitet, aber nicht ausgeführt git stash schon wieder? Oder meinst du etwas ganz anderes?

    – Torek

    25. September 2013 um 11:35 Uhr

  • Jawohl. Beachten Sie, dass ich in meiner (langen) Bearbeitung empfehle, das zu begehen, was Sie jetzt schon einmal haben apply-ing ein Versteck. Du nicht verfügen über um dies zu tun, aber es macht die Dinge für Sie viel einfacher zu betrachten. Sie können verwenden rebase -i um mehrere Commits zusammenzuquetschen oder bestimmte Änderungen später herauszupicken oder was auch immer.

    – Torek

    25. September 2013 um 12:28 Uhr

  • Jawohl: git stash apply --index (Denken Sie an die beiden Bindestriche). Wenn Sie weglassen --index, keine große Sache; der einzige Punkt von --index ist, das Staged/Unstaged-Setup beizubehalten. (Wahrscheinlich hatten Sie von Anfang an keine spezielle Einrichtung.) Dann git status usw. und nach Wunsch hinzufügen/festschreiben usw. Wenn (und nur wenn) Sie mit dem Stash fertig sind, verwenden Sie git stash drop es zu verwerfen.

    – Torek

    25. September 2013 um 12:45 Uhr


  • Solange Sie halten (nicht drop oder pop) the stash, haben Sie bei einem Commit immer den original gestashten Code sicher, da ein stash ist ein Bekenntnis! Wenn Sie es genau zurückbekommen möchten, aber auf einem Zweig, verwenden Sie git stash branch (siehe diesen Abschnitt oben oder die Pro Git-Buch in Shunyas Antwort). Sie können dann git checkout dieser Zweig, oder git cherry-pick das Commit von diesem Zweig usw.

    – Torek

    25. September 2013 um 12:55 Uhr

  • @ChuckWolber: Die Namenskonventionen von Git lassen sehr zu wünschen übrig (wie viele verschiedene Bedeutungen können wir den Wörtern “remote”, “tracking” und “branch” zuweisen?!). Es ist jedoch erwähnenswert, dass Sie einen Stash auf etwas anwenden können, das nichts mit dem ursprünglichen Stash zu tun hat.

    – Torek

    10. Mai 2018 um 18:54 Uhr

So stellen Sie gespeicherte nicht festgeschriebene Anderungen wieder her
Stefan Falasca

git stash pop

wird alles wieder in Ordnung bringen

wie in den Kommentaren vorgeschlagen, können Sie verwenden git stash branch newbranch um den Stash auf einen neuen Zweig anzuwenden, was dasselbe ist wie das Ausführen von:

git checkout -b newbranch
git stash pop

  • Danke für die Hilfe. Kann ich diese Änderungen in einen neuen Zweig übertragen? Im Moment bin ich auf dem Entwicklungszweig

    – Aswathy P. Krishnan

    25. September 2013 um 11:01 Uhr


  • git stash branch newbranch erstellt einen neuen Branch mit den gespeicherten Änderungen.

    – Robert

    25. September 2013 um 11:04 Uhr

  • @Robert: git stash branch newbranch wird das in der Tat tun; Beachten Sie jedoch, dass der neue Zweig mit seinem übergeordneten Satz auf den Commit erstellt wird, der der war HEAD damals die stash geschah. Mit anderen Worten, wenn Sie nach einer langen Hack-Session oder was auch immer zurückkommen, auf das Durcheinander starren und entscheiden: “Ich hätte das auf einen Ast legen sollen, anstatt es zu verstauen” 🙂

    – Torek

    25. September 2013 um 11:06 Uhr

  • Manchmal will man einfach die TLDR-Antwort 🙂

    – Sachinruk

    15. September 2017 um 6:54 Uhr

  • @sachinruk manchmal? Immer kommen die Leute nicht zur Dokumentation zu StackOverflow, das ist nicht der Zweck, und damit kritisiere ich weder gut geschriebene Antworten noch verteidige ich Einzeiler.

    – Mel Macaluso

    26. November 2019 um 10:36 Uhr


1646264893 738 So stellen Sie gespeicherte nicht festgeschriebene Anderungen wieder her
Shivansh Rajolia – HeLleR

So überprüfen Sie Ihren Stash-Inhalt: –

Git-Versteckliste

Wenden Sie eine bestimmte Stash-Nummer aus der Stash-Liste an: –

git stash stash [email protected]{2}

oder um nur den ersten Vorrat aufzutragen:-

Git Stash-Pop

Notiz: git stash pop entfernt den Stash aus Ihrer Stash-Liste, während git stash apply dies nicht tut. Verwenden Sie sie also entsprechend.

Um dies zu vereinfachen, haben Sie zwei Möglichkeiten, Ihren Vorrat erneut anzuwenden:

  1. git stash pop – Stellen Sie den gespeicherten Zustand wieder her, aber es löscht den Stash aus dem temporären Speicher.
  2. git stash apply – Stellt den gespeicherten Zustand wieder her und belässt die Stash-Liste für eine mögliche spätere Wiederverwendung.

Sie können ausführlicher darüber lesen Git-Verstecke In diesem Artikel.

Auf dem Mac hat das bei mir funktioniert:

git stash list (zeige alle deine Stashs)

git stash list

git stash apply (nur die gewünschte Nummer aus deiner Stash-Liste)

so was:

git stash apply 1

1646264893 913 So stellen Sie gespeicherte nicht festgeschriebene Anderungen wieder her
Supun Sandeeptha

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 gespeicherten Commits “git stash apply” anwenden.

917400cookie-checkSo stellen Sie gespeicherte, nicht festgeschriebene Änderungen wieder her

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy