Git Stash Pop-Konflikte rückgängig machen

Ankit Raj Goyal 20 Juni 2023
  1. Git Stash Pop Merge-Konflikte - Das Problem
  2. Git Stash Pop mit Konflikten rückgängig machen – Schlechte Zusammenführungen abbrechen, um zu einem sauberen Zustand zurückzukehren
  3. Machen Sie Git Stash Pop rückgängig, indem Sie die schlechten Konflikte lösen
Git Stash Pop-Konflikte rückgängig machen

Sie können git stash pop mit Zusammenführungskonflikten mit den Lösungen in diesem Artikel rückgängig machen. Wir zeigen Ihnen, wie Sie die Operation Bad Stash Pop abbrechen und zu einem sauberen Zustand zurückkehren können.

Aber wir demonstrieren auch eine Methode, um die Konflikte zu lösen und git stash pop mit neuen guten Merges rückgängig zu machen.

Git Stash Pop Merge-Konflikte - Das Problem

In einem schnelllebigen Entwickler-Workflow ist es üblich, den aktuellen Status zu speichern und zu anderen Funktionen zu springen, wenn neue Ideen auftauchen.

Wenn wir unsere Arbeit an der neuen Funktion abgeschlossen haben, wenden wir die gestashten Änderungen mit dem Befehl git stash pop an. Aber manchmal führt dieser Hin- und Her-Workflow zu Zusammenführungskonflikten.

Möglicherweise möchten Sie in einer solchen Situation eines von zwei Dingen tun.

  1. Brechen Sie entweder die fehlerhaften Zusammenführungen ab und kehren Sie zum vorherigen sauberen Zustand zurück.
  2. Möglicherweise möchten Sie die Dateien/Verzeichnisse lokal bearbeiten oder aus einem Remote-Repository abrufen, um die Zusammenführungskonflikte zu lösen. Anschließend können Sie die korrekten Änderungen mit neuen Commits zusammenführen.

Lassen Sie uns beide Lösungen sehen.

Git Stash Pop mit Konflikten rückgängig machen – Schlechte Zusammenführungen abbrechen, um zu einem sauberen Zustand zurückzukehren

Sie sollten einen der folgenden Befehle verwenden, wenn Sie die Änderungen in der Operation Bad Stash Pop entfernen möchten. Diese Methoden brechen alle Änderungen ab, die den Zusammenführungskonflikt verursacht haben, und kehren zum vorherigen fehlerfreien Zustand zurück.

git reset --merge

Schauen wir uns zunächst die Einrichtung an. Wir haben einen master-Zweig mit ein paar Dateien, etwa so:

Ersteinrichtung des Hauptzweigs

Wir forken dann einen lokalen Zweig new_branch davon ab. Wir ändern einige Dateien in diesem Zweig und schreiben diese Änderungen fest.

erstmalige Einrichtung des neuen Zweigs

Wir nehmen nun ein paar Änderungen in file1.txt und file2.txt vor. Diese Änderungen stashen wir dann.

git stash -u -m "Modify file1 and file2 in new_branch"

Der git stash nimmt hier einige Optionen entgegen. Das -u-Flag lässt uns die nicht nachverfolgten Änderungen speichern.

Das -m-Flag hat die gleiche Bedeutung – es ermöglicht uns, unserem Vorrat eine semantische Nachricht hinzuzufügen.

in neuem Zweig speichern

Wir nehmen nun einige Änderungen in der gleichen Datei1.txt und Datei2.txt in unserem master-Zweig vor. Diese Dateien haben unterschiedliche Versionen in unserem master und new_branch.

Dateimaster nach Fork ändern

Wenn wir den Stash im Zweig master anwenden wollen, führen diese unterschiedlichen Versionen von file1 und file2 zu Konflikten.

Git-Stash-Pop-Konflikte

Wenn wir jetzt unser Repository überprüfen, finden wir wegen des schlechten Merge-Versuchs seltsame Dateien darin.

git stash pop widerspricht seltsamem Verhalten

Wir können den Befehl reset mit einigen Optionen verwenden, um fehlgeschlagene Stash-Pops rückgängig zu machen.

git reset --merge

Der git reset hat kürzlich die Option --merge gelernt. Die Option --merge ist wie die Standardoption --mixed, gilt aber nur für die Dateien, die vom Zusammenführungsvorgang betroffen sind.

Wir sehen, dass das Ergebnis dieses Befehls in unserem Fall darin besteht, einen schlechten Stash-Pop rückgängig zu machen.

git reset merge

git checkout -f

Wir können das gleiche Ergebnis oben sehen, wenn wir den Befehl git checkout verwenden, indem wir das Flag -f übergeben.

git checkout -f

Ohne Argumente nimmt der Befehl git checkout das Standardargument HEAD. Unser letzter Commit war gut ohne die schlechten Stash-Pop-Merge-Konflikte, und so wischt dieser Befehl die Tafel sauber.

Das Flag -f steht für die Option --force. Es hilft, indem es nicht zusammengeführte Commits und nicht nachverfolgte Dateien ignoriert, um einen gesunden Repository-Zustand sicherzustellen.

git checkout force option

Die beiden oben genannten Methoden eignen sich am besten, um Git Stash Pop mit Konflikten rückgängig zu machen, wenn Sie sie nur sauber löschen möchten.

Aber wenn Sie die Commits mit neuen guten Merges auflösen möchten, müssen Sie die folgenden Methoden verwenden.

Machen Sie Git Stash Pop rückgängig, indem Sie die schlechten Konflikte lösen

Sie müssen Ihre Dateien und Verzeichnisse in allen Zweigen schön synchron bearbeiten, um Konflikte zu lösen.

Sie können dies lokal mit ein paar Befehlen tun oder es aus Ihrem Remote-Repository abrufen. Wir werden uns beide Lösungen ansehen.

Konflikte lösen, um fehlgeschlagene Stash-Pops mit Git rückgängig zu machen – für lokale Branches

Wir haben das gleiche Setup wie oben. Aber dieses Mal werden wir die Konflikte zwischen unserem Hauptzweig und unserem neuen_Zweig lösen und unseren Vorrat erneut anwenden, um das gewünschte Ergebnis zu erzielen.

Wir entfernen zuerst die Änderungen in unseren Dateien, die die Stash-Pop-Konflikte verursachen. Die Änderung, die wir in file1 und file2 in unserem master nach dem Fork vorgenommen haben, hat das Problem verursacht.

Wir reseten unseren master auf den Commit vor dem Commit mit den schlechten Änderungen an unserer Datei1 und Datei2.

git reset <good_commit_hash>

git reset bad commit

git checkout HEAD .

Wir setzen unseren Arbeitsbereich auch mit dem Befehl checkout zurück. Beachten Sie den abschließenden Punkt ., der alle Dateien auswählt, um sicherzustellen, dass alle Konflikte gelöst werden.

Sie könnten auch verwenden:

git reset HEAD file1.txt file2.txt

Denn in unserem Fall kennen wir die beiden relevanten Dateien file1.txt und file2.txt.

In dieser Form setzt der Befehl git checkout den Arbeitsbereich so, dass er an HEAD, dem letzten guten Commit ohne Konflikte, ausgerichtet ist.

git checkout head

Wir sehen jetzt, dass der Commit aus unserem master-Zweig verschwunden ist.

Fehlerhafter Commit wurde vom lokalen Setup entfernt

Wir wenden jetzt unsere gespeicherten Änderungen erfolgreich an.

git stash pop

git guter stash pop

erfolgreiche Auflösung Stash anwenden

Git Undo Bad Stash Pop – Lösen Sie Konflikte durch Abrufen aus dem Remote-Repository

Wenn Ihr Workflow so eingerichtet ist, dass das Remote-Repository den am wenigsten fehlerfreien Zustand aufweist, können Sie die Konflikte mit fehlerhaftem Stash lösen, indem Sie von der Remote zugreifen.

Lassen Sie uns zunächst einen konkreten Anwendungsfall für diese Lösung aufstellen.

gesunde Fernbedienung

lokaler Master hinter Remote

Wir sehen, dass unsere lokale Fernbedienung um 1 Commit hinter unserer Remote-Hauptleitung liegt. Angenommen, wir erstellen jetzt einen neuen lokalen Zweig, der den Remote-Master verfolgt, und speichern einige Änderungen.

git fetch --all

git switch -c new_branch_tracking_remote_master origin/master

lokaler Branch-Tracking-Remote-Master

Wir stecken einige Änderungen in diesen Zweig.

git stash -m "Change file5.txt in local branch"

stash local tracking remote master

Jetzt stellen wir fest, dass wir diese Änderungen in einem neuen lokalen Zweig haben möchten. Wir forken einen neuen lokalen Zweig von unserem lokalen Master.

git checkout master

git branch local_branch_2

neuer Fork vom lokalen Master

Wir sehen, dass dieser Zweig um 1 Commit zurückliegt und die Datei file5.txt nicht enthält. Wenn wir jetzt unseren Vorrat knallen, führt das zu schlimmen Merge-Konflikten.

schlechter Git-Pop-Remote-Workflow

Um Konflikte zu lösen, ziehen wir in diesem Fall den entfernten Master in unseren lokalen Master. Wir müssen zuerst das Remote-Repository abrufen.

git fetch --all

Dann führen wir unseren local master mit dem remote master zusammen.

git merge origin/master

Lokalen Master von Remote ziehen

Wir sehen jetzt, dass unser lokaler Master mit dem entfernten Master synchronisiert ist, indem wir die neuesten Änderungen abrufen. Sie können auch sehen, dass es die entscheidende file5.txt enthält.

aktualisierter lokaler Master

Wir werden nun unseren lokalen Branch, local_branch_2, auf den aktualisierten local master rebasen.

Zuerst checkout die Filiale vor Ort.

git checkout local_branch_2

Jetzt rebasieren Sie es auf dem lokalen Master.

git rebase master

Dadurch wird unser local_branch_2 gesund und bereit, die gespeicherten Änderungen zu empfangen.

Rebase lokal auf Master

Wir wenden jetzt unsere gespeicherten Änderungen an.

git stash pop

Wir sehen dieses Mal, dass die versteckten Änderungen erfolgreich angewendet werden.

git stash pop remote setup erfolgreich

Wir haben die Konflikte gelöst und die gespeicherten Änderungen erfolgreich zusammengeführt.

erfolgreiche Einrichtung von git stash pop remote

Ressourcen:

  1. https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
  2. https://www.theserverside.com/video/How-to-easily-merge-and-resolve-git-stash-pop-conflicts
  3. https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
  4. https://newbedev.com/git-stash-blunder-git-stash-pop-and-ended-up-with-merge-conflicts
  5. https://stackoverflow.com/questions/4778882/how-to-launch-and-edit-a-file-from-git-using-notepad

Verwandter Artikel - Git Stash