Machen Sie Git Stash Pop rückgängig, was zu Zusammenführungskonflikten führt

519

Ich nahm Änderungen an meiner Codebasis vor und merkte nicht, dass ich mich in einem alten Themenzweig befand. Um sie zu übertragen, wollte ich sie verstauen und dann auf einen neuen Zweig außerhalb des Masters anwenden. Ich habe git stash poplaufende Änderungen in diesen neuen Zweig übertragen und dabei vergessen, dass ich vor dem Erstellen des neuen Zweigs keine neuen Änderungen in den Master übernommen hatte. Dies führte zu einer Reihe von Zusammenführungskonflikten und dem Verlust eines sauberen Vorrats meiner Änderungen (da ich Pop verwendet habe).

Wie kann ich meine versteckten Änderungen wiederherstellen, um sie ordnungsgemäß anzuwenden, nachdem ich den neuen Zweig korrekt neu erstellt habe?

acjay
quelle

Antworten:

656

Wie sich herausstellt, ist Git klug genug, kein Versteck fallen zu lassen, wenn es nicht sauber angewendet wird. Mit den folgenden Schritten konnte ich in den gewünschten Zustand gelangen:

  1. So lösen Sie die Zusammenführungskonflikte: git reset HEAD .(Beachten Sie den nachfolgenden Punkt)
  2. So speichern Sie die widersprüchliche Zusammenführung (nur für den Fall): git stash
  3. So kehren Sie zum Master zurück: git checkout master
  4. So ziehen Sie die letzten Änderungen ab: git fetch upstream; git merge upstream/master
  5. So korrigieren Sie meinen neuen Zweig: git checkout new-branch; git rebase master
  6. So wenden Sie die richtigen Änderungen an (jetzt 2. auf dem Stapel): git stash apply stash@{1}
acjay
quelle
14
Großartig, danke! # 6 ist wirklich die Antwort, nach der ich gesucht habe. Könnte git stash dropals letzten Schritt ein hinzufügen , um den unerwünschten Vorrat von # 2 loszuwerden.
Austinmarton
1
# 2 funktioniert nicht, wenn es nicht zusammengeführte Pfade gibt, sondern gibt stattdessen den hier beschriebenen Fehler aus: stackoverflow.com/questions/5483213/…
Étienne
5
Nicht ganz richtig - Git behält den Stash in der Stash-Liste, wenn er nicht sauber angewendet werden kann. In diesen Dokumenten finden Sie Informationen zu git stash popfolgenden Themen : "Das Anwenden des Status kann bei Konflikten fehlschlagen. In diesem Fall wird er nicht aus der Stash-Liste entfernt. Sie müssen die Konflikte git stash dropmanuell lösen und anschließend manuell aufrufen ." ( git-scm.com/docs/git-stash )
Carolyn Conway
4
Seltsam, wie diese Antwort und die Frage genau in derselben Minute veröffentlicht werden
rufen Sie mich
14
@ call-me Dies ist etwas, von dem ich denke, dass die Leute es tatsächlich öfter tun sollten! Beachten Sie, dass das Formular "Frage stellen" ein Kontrollkästchen enthält, mit dem Sie Ihre eigene Frage im selben Formular beantworten können :). Dies passiert mir manchmal, wenn ich gerade eine Frage verfasse, die mich verblüfft, aber wenn ich versuche, die Frage so einzustellen, dass sie gut für StackOverflow ist, finde ich am Ende die Lösung heraus. Das ist eine Weile her, also erinnere ich mich nicht, ob das hier der Fall war, aber ich vermute, dass genau das passiert ist.
Acjay
340

Zum Glück git stash popist nicht das Versteck wechselt im Fall eines Konflikts!

Also nichts, worüber Sie sich Sorgen machen müssen, bereinigen Sie einfach Ihren Code und versuchen Sie es erneut.

Angenommen, Ihre Codebasis war vorher sauber, Sie könnten in diesen Zustand zurückkehren mit: git checkout -f
Dann tun Sie das, was Sie vergessen haben, z. B. git merge missing-branch
feuern Sie danach git stash poperneut und Sie erhalten den gleichen Vorrat, der zuvor in Konflikt geraten ist.

Achtung: Der Stash ist sicher, nicht festgeschriebene Änderungen im Arbeitsverzeichnis jedoch nicht. Sie können durcheinander geraten.

flori
quelle
16
Was ich verstehe ist, dass Sie einfach aufräumen und wieder platzen können, aber Sie können es nicht rückgängig machen . Wenn der Pop mit anderen nicht festgeschriebenen Änderungen gemischt wird, müssen Sie manuell bereinigen.
Haridsv
Dies ist eine sehr einfache Lösung und hat für mich hervorragend funktioniert. Es wird davon ausgegangen, dass Sie alles zurücksetzen können, was sich lokal geändert hat (es gab keine Änderungen vor / nach dem Löschen des Stashs), was meiner Meinung nach in den meisten Situationen funktioniert. Wenn Sie einige zusätzliche Änderungen speichern mussten, bevor Sie erkannten, dass dies ein Problem war, sollten Sie in der Lage sein, diese Dateien festzuschreiben, bevor Sie in den meisten Fällen einen Checkout erzwingen.
Project707
Dies war bei mir nicht der Fall. Ich nannte git stash popes versucht, automatisch zusammenzuführen, kollidierte und behielt es.
Trevor Hickey
1
@TrevorHickey Der Punkt dieser Antwort war, dass der Stash so bleibt, wie er im Falle eines Konflikts ist, den Sie git stash popso oft aufrufen können, wie Sie benötigen, bis er ohne Konflikt endet. Ja, nach Ihrem Konflikt ist das Arbeitsverzeichnis durcheinander. Sie können es jedoch bereinigen und git stash poperneut aufrufen .
Flori
5
Dieser Befehl zum Rückgängigmachen des letzten Stash-Applys ist sehr nützlich : git checkout -f!
Lefi Tarik
16

Die Anweisungen hier sind etwas kompliziert, daher werde ich etwas Unkomplizierteres anbieten:

  1. git reset HEAD --hard Geben Sie alle Änderungen am aktuellen Zweig auf

  2. ... Führen Sie nach Bedarf Zwischenarbeiten durch

  3. git stash pop Legen Sie den Vorrat zu einem späteren Zeitpunkt erneut ab, wenn Sie bereit sind

anon58192932
quelle
vimeo.com/79954057
faintsignal
8
git checkout -f

muss funktionieren, wenn Ihr vorheriger Zustand sauber ist.

Allahbakash.G
quelle