Wie kann man einen Stash Pop abbrechen?

Lesezeit: 8 Minuten

Benutzer-Avatar
Fallbash

Ich habe einen Stash geöffnet und es gab einen Merge-Konflikt. Im Gegensatz zu der Frage, die als Duplikat aufgeführt ist, hatte ich bereits einige nicht festgeschriebene Änderungen im Verzeichnis, die ich behalten wollte. Ich möchte nicht nur den Merge-Konflikt verschwinden lassen, sondern auch mein Verzeichnis wieder in den Zustand vor dem Pop bringen.

Ich habe es versucht git merge --abort, aber git behauptete, dass keine Zusammenführung im Gange sei. Gibt es eine einfache Möglichkeit, einen Pop abzubrechen, ohne die Änderungen zu zerstören, die ich ursprünglich im Verzeichnis hatte?

  • Was Ihre nicht festgeschriebenen Änderungen betrifft: Waren diese Änderungen bereits im Index?

    – Jörgensen

    16. Dezember 2011 um 1:47 Uhr

  • Kannst du die Version von Git posten, die du verwendest?

    – Blechmann

    12. November 2012 um 5:27 Uhr

  • Siehe auch: git stash blunder: git stash pop und endete mit Zusammenführungskonflikten

    – Brad Koch

    18. April 2013 um 17:45 Uhr


  • Die akzeptierte Antwort sieht kompliziert aus. Ich denke, es ist eine ziemlich gute allgemeine Praxis, niemals so etwas wie einen Versuch zu tun git stash pop auf einem unsauberen Arbeitsverzeichnis. In diesem Fall können Sie einfach git reset --hard und Ihr Vorrat ist noch intakt. (Dies ist mehr oder weniger das, was das verlinkte Thema von @BradKoch vorschlägt)

    – Steven Lu

    28. Mai 2015 um 19:04 Uhr


  • @StevenLu, ich stimme zu, aber das Problem kann in einem sauberen Arbeitsverzeichnis auftreten, wenn Sie die Änderungen speichern, um sie in einen anderen Zweig zu verschieben. Der Stash kollidiert mit Commits, die auf dem neuen Zweig existieren, die auf dem alten nicht existierten.

    – Jake Stevens-Haas

    16. Dezember 2019 um 23:22 Uhr


Benutzer-Avatar
Kenn Sebesta

Einfacher Einzeiler

Ich habe immer verwendet

git reset --merge

Ich kann mich nicht erinnern, dass es jemals gescheitert wäre.


Notiz: git reset --merge verwirft alle inszenierten Änderungen

  • Geben Sie dieser Person eine Medaille

    – Phil Jung

    16. Dezember 2020 um 15:07 Uhr

  • Am besten, ich weiß nicht, warum die Leute diese einzelne Zeile nicht geben

    – Saransh Dhyani

    31. Dezember 2020 um 6:48 Uhr

  • Was passiert mit den zuvor gespeicherten Inhalten, wenn Sie dies tun? Wird es wieder in den Vorrat gelegt oder ist es verloren?

    – Adam Parkin

    1. April 2021 um 17:52 Uhr

  • @AdamParkin Wenn die git stash pop aufgrund von Zusammenführungskonflikten nicht erfolgreich ist, wird der Stash-Inhalt automatisch im Stash gespeichert, anstatt ihn zu löschen

    – Saroopashree Kumaraguru

    18. Juni 2021 um 14:28 Uhr


  • @Berni Ich habe kürzlich die Antwort von aktualisiert git reset --merge zu git reset --keep, als Reaktion auf einen Randfall, bei dem der Benutzer Dateien bereitgestellt hatte. Ist das vielleicht Ihr Fall? In diesem Fall würde ich empfehlen, diese Dateien vorher aus der Staging-Umgebung zu entfernen und es erneut zu versuchen.

    – Kenn Sebesta

    22. November 2021 um 23:40 Uhr

Mein Anwendungsfall: Ich habe gerade versucht, auf den falschen Zweig zu springen und Konflikte zu bekommen. Alles, was ich brauche, ist, den Pop rückgängig zu machen, aber ihn in der Stash-Liste zu behalten, damit ich ihn auf dem richtigen Zweig herausholen kann. Ich war das:

git reset HEAD --hard
git checkout my_correct_branch
git stash pop

Leicht.

  • Also bleibt der Vorrat, den du haben möchtest, in der Vorratsliste, bis du einen erfolgreichen Pop hast?

    – Ryan Clark

    1. Februar 2016 um 21:36 Uhr

  • Dies ist keine Antwort auf die ursprüngliche Frage, da lokale Änderungen, die nicht festgeschrieben wurden, gelöscht würden.

    – Dmitri

    23. Februar 2017 um 2:52 Uhr

  • @RyanClark Siehe DavidGs Antwort unten. Grundsätzlich ja, es bleibt in der Stash-Liste.

    – fkorsa

    4. September 2017 um 8:44 Uhr

  • Ich denke, die überwiegende Mehrheit der Benutzer, die sich in dieser Situation befinden, wird diese Lösung als ideal empfinden. Ich kann mir keine Situation vorstellen, in der ich nicht festgeschriebene Änderungen in meinem Arbeitsverzeichnis habe, bevor ich es versuche stash pop hinein. Das klingt nach einem Rezept für eine Katastrophe.

    – Shadoninja

    15. April 2019 um 16:36 Uhr

  • Hübsch. Nachdem ich dies gelesen hatte, sah ich mir Git Stash Pop-Dokumente an und es heißt: “Das Anwenden des Status kann bei Konflikten fehlschlagen; in diesem Fall wird es nicht aus der Stash-Liste entfernt.”. Aus diesem Grund kann der Stash nach einem Zurücksetzen / Auschecken erneut geöffnet werden.

    – Brady Holt

    10. Juli 2019 um 18:27 Uhr


Ok, ich glaube, ich habe “git stash unapply” ausgearbeitet. Es ist komplexer als git apply --reverse da Sie eine umgekehrte Zusammenführungsaktion benötigen, falls eine Zusammenführung durch die durchgeführt wurde git stash apply.

Die umgekehrte Zusammenführung erfordert, dass alle aktuellen Änderungen in den Index gepusht werden:

  • git add -u

Dann invertieren Sie die merge-recursive das wurde von gemacht git stash apply:

  • git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1

Jetzt bleiben Ihnen nur die Nicht-Stash-Änderungen. Sie werden in den Index aufgenommen. Sie können verwenden git reset um Ihre Änderungen rückgängig zu machen, wenn Sie möchten.

Da Ihr Original git stash apply failed Ich nehme an, dass auch die Umkehrung fehlschlägt, da einige der Dinge, die rückgängig gemacht werden sollen, nicht erledigt wurden.

Hier ist ein Beispiel, das zeigt, wie die Arbeitskopie (via git status) endet wieder sauber:

 $ git status
# On branch trunk
nothing to commit (working directory clean)
 $ git stash apply
Auto-merging foo.c
# On branch trunk
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.c
#
no changes added to commit (use "git add" and/or "git commit -a")
 $ git add -u
 $ git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Auto-merging foo.c
 $ git status
# On branch trunk
nothing to commit (working directory clean)

  • Gehen die zuvor gespeicherten Änderungen danach für immer verloren oder befinden sie sich wieder im Stash?

    –Brian H.

    18. August 2017 um 10:06 Uhr

  • git stash apply lässt nie einen Stash fallen, und wenn eine Zusammenführung dann fehlschlägt git stash pop behält auch den Vorrat

    – xeruf

    2. Juni 2018 um 1:16 Uhr

  • Wenn es während des ursprünglichen Stash-Pops zu einem Merge-Konflikt kam, werden schlimme Dinge passieren

    – 3ozän

    1. November 2019 um 20:15 Uhr

  • Scrollen Sie weiter für bessere Antworten

    – Eric Wiener

    27. Februar 2021 um 18:54 Uhr

Benutzer-Avatar
DavidGamba

Bearbeiten: Von der git help stash Dokumentation im Popbereich:

Die Anwendung des Staates kann an Konflikten scheitern; in diesem Fall wird es nicht aus der Stash-Liste entfernt. Sie müssen die Konflikte von Hand lösen und danach git stash drop manuell aufrufen.

Wenn die Option –index verwendet wird, wird versucht, nicht nur die Änderungen des Arbeitsbaums wiederherzustellen, sondern auch die des Index. Dies kann jedoch fehlschlagen, wenn Sie Konflikte haben (die im Index gespeichert sind, wo Sie also die Änderungen nicht mehr so ​​anwenden können, wie sie ursprünglich waren).

Versuchen Sie, alle Ihre Repos in ein neues Verzeichnis zu kopieren (damit Sie eine Kopie davon haben) und führen Sie Folgendes aus:

git stash show und speichern Sie diese Ausgabe irgendwo, wenn Sie sich darum kümmern.

dann: git stash drop um den widersprüchlichen Stash dann zu löschen: git reset HEAD

Das sollte Ihr Repo in dem Zustand belassen, in dem es vorher war (hoffentlich konnte ich Ihr Problem immer noch nicht reproduzieren).

===

Ich versuche, Ihr Problem zu reproduzieren, aber alles, was ich bekomme, wenn ich es benutze git stash pop ist:

error: Your local changes to the following files would be overwritten by merge:
...
Please, commit your changes or stash them before you can merge.
Aborting

In einem sauberen Verzeichnis:

git init
echo hello world > a
git add a & git commit -m "a"
echo hallo welt >> a
echo hello world > b
git add b & git commit -m "b"
echo hallo welt >> b
git stash
echo hola mundo >> a
git stash pop

Ich sehe nicht, dass Git versucht, meine Änderungen zusammenzuführen, es schlägt einfach fehl. Haben Sie irgendwelche Repro-Schritte, die wir befolgen können, um Ihnen zu helfen?

Wenn Sie sich keine Gedanken über andere vorgenommene Änderungen machen müssen und nur zum letzten Commit zurückkehren möchten, können Sie Folgendes tun:

git reset .
git checkout .
git clean -f

Benutzer-Avatar
Agentgonzo

OK, ich glaube, ich habe es geschafft, einen Arbeitsablauf zu finden, der Sie dorthin zurückbringt, wo Sie sein müssen (als ob Sie den Pop nicht gemacht hätten).

MACHEN SIE VORHER EINE SICHERUNG!! Ich weiß nicht, ob das für Sie funktioniert, kopieren Sie also Ihr gesamtes Repo, falls es nicht funktioniert.

1) Beheben Sie die Zusammenführungsprobleme und beheben Sie alle Konflikte, indem Sie alle Änderungen auswählen, die aus dem Patch stammen (in tortoisemerge wird dies als one.REMOETE (ihre) angezeigt).

git mergetool

2) Bestätigen Sie diese Änderungen (sie werden bereits über den Befehl mergetool hinzugefügt). Geben Sie ihm eine Commit-Nachricht von “Merge” oder etwas, an das Sie sich erinnern.

git commit -m "merge"

3) Jetzt haben Sie immer noch Ihre lokalen, unstagierten Änderungen, die Sie ursprünglich begonnen haben, mit einem neuen Commit aus dem Patch (wir können dies später entfernen). Bestätigen Sie jetzt Ihre nicht bereitgestellten Änderungen

git add .
git add -u .
git commit -m "local changes"

4) Kehren Sie den Patch um. Dies kann mit dem folgenden Befehl erfolgen:

git stash show -p | git apply -R

5) Übernehmen Sie diese Änderungen:

git commit -a -m "reversed patch"

6) Entfernen Sie die Patch/Unpatch-Commits

git rebase -i HEAD^^^

Entfernen Sie daraus die beiden Zeilen mit ‘merge’ und ‘reversed patch’ darin.

7) Holen Sie sich Ihre unstanged Änderungen zurück und machen Sie den Commit der „lokalen Änderungen“ rückgängig

git reset HEAD^

Ich habe es mit einem einfachen Beispiel durchgespielt und es bringt Sie dorthin zurück, wo Sie sein möchten – direkt bevor der Stash gepoppt wurde, mit Ihren lokalen Änderungen und mit dem Stash, der immer noch zum Popen verfügbar ist.

Benutzer-Avatar
PID

Ich habe das etwas anders gelöst. Folgendes ist passiert.

Zuerst bin ich auf den falschen Ast gesprungen und habe Konflikte bekommen. Der Stash blieb intakt, aber der Index befand sich in der Konfliktlösung und blockierte viele Befehle.

Eine einfache git reset HEAD brach die Konfliktlösung ab und beließ die uncommitted (and UNERWÜNSCHT) Änderungen.

Mehrere git co <filename> setzte den Index auf den Anfangszustand zurück. Schließlich wechselte ich mit Filiale git co <branch-name> und neu starten git stash popdie ohne Konflikte gelöst wurde.

1011310cookie-checkWie kann man einen Stash Pop abbrechen?

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

Privacy policy