960 Stimmen

Rückgängig machen Sie git stash pop, das zu einem Merge-Konflikt führt

Ich habe damit begonnen, Änderungen an meinem Codebase vorzunehmen, ohne zu bemerken, dass ich mich auf einem alten Themenbranch befand. Um sie zu übertragen, wollte ich sie vorübergehend speichern und dann auf einem neuen Branch von Master anwenden. Ich habe git stash pop verwendet, um Arbeitsänderungen im Gange auf diesen neuen Branch zu übertragen, und vergessen, dass ich neue Änderungen nicht in den Master gezogen hatte, bevor ich den neuen Branch erstellt habe. Dies führte zu einer Vielzahl von Merge-Konflikten und zum Verlust eines sauberen Stash meiner Änderungen (da ich pop verwendet habe).

Wie kann ich meine gestashten Änderungen wiederherstellen, um sie ordnungsgemäß anzuwenden, sobald ich den neuen Branch korrekt nachgebildet habe?

1092voto

acjay Punkte 31336

Wie sich herausstellt, ist Git klug genug, um einen Stash nicht zu löschen, wenn er nicht sauber angewendet werden kann. Ich konnte den gewünschten Zustand mit den folgenden Schritten erreichen:

  1. Um die Merge-Konflikte zurückzustellen: git reset HEAD . (beachte den Punkt am Ende)
  2. Um den konfliktbehafteten Merge zu speichern (nur für den Fall): git stash
  3. Um zum Master zurückzukehren: git checkout master
  4. Um die neuesten Änderungen abzurufen: git fetch upstream; git merge upstream/master
  5. Um meinen neuen Branch zu korrigieren: git checkout new-branch; git rebase master
  6. Um die korrekten gestashten Änderungen anzuwenden (jetzt an zweiter Stelle im Stack): git stash apply stash@{1}

526voto

flori Punkte 11900

Zum Glück ändert git stash pop im Falle eines Konflikts nicht den Zwischenspeicher!

Also nichts, worüber man sich Sorgen machen müsste, einfach den Code aufräumen und es erneut versuchen.

Angenommen, Ihr Codebase war sauber, könnten Sie mit dem Befehl git checkout -f zu diesem Zustand zurückkehren.
Dann erledigen Sie die Dinge, die Sie vergessen haben, z.B. git merge missing-branch
Dann einfach erneut git stash pop aufrufen und Sie erhalten den gleichen Zwischenspeicher, der zuvor einen Konflikt verursacht hat.

Denken Sie daran: Der Zwischenspeicher ist sicher, aber nicht festgelegte Änderungen im Arbeitsverzeichnis sind natürlich nicht sicher. Sie könnten durcheinander geraten.

136voto

Gabriel Petersson Punkte 4874

Der einfachste Befehl, er funktioniert überall, einschließlich git stash pop, git merge usw.

Aber Vorsicht! Du wirst alle Änderungen an nicht verfolgten Dateien verlieren. Verfolgte Dateien bleiben intakt.

git reset --merge

47voto

fIwJlxSzApHEZIl Punkte 9729

Die Anweisungen hier sind etwas kompliziert, also werde ich etwas Einfacheres anbieten:

  1. git reset HEAD --hard Alle Änderungen im aktuellen Branch verwerfen

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

  3. git stash pop Das Versteckte wieder zu einem späteren Zeitpunkt zurückholen, wenn Sie bereit sind

37voto

Allahbakash.G Punkte 1681
git checkout -f

Muss funktionieren, wenn Ihr vorheriger Zustand sauber ist.

ACHTUNG: Vorsicht - Sie verlieren alle nicht verfolgten Änderungen an Ihren Dateien.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X