Git Stash Pop-Konflikte rückgängig machen
- Git Stash Pop Merge-Konflikte - Das Problem
- Git Stash Pop mit Konflikten rückgängig machen – Schlechte Zusammenführungen abbrechen, um zu einem sauberen Zustand zurückzukehren
- Machen Sie Git Stash Pop rückgängig, indem Sie die schlechten Konflikte lösen
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.
- Brechen Sie entweder die fehlerhaften Zusammenführungen ab und kehren Sie zum vorherigen sauberen Zustand zurück.
- 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:
Wir forken dann einen lokalen Zweig new_branch
davon ab. Wir ändern einige Dateien in diesem Zweig und schreiben diese Änderungen fest.
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.
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
.
Wenn wir den Stash im Zweig master
anwenden wollen, führen diese unterschiedlichen Versionen von file1
und file2
zu Konflikten.
Wenn wir jetzt unser Repository überprüfen, finden wir wegen des schlechten Merge-Versuchs seltsame Dateien darin.
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 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.
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 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.
Wir sehen jetzt, dass der Commit aus unserem master
-Zweig verschwunden ist.
Wir wenden jetzt unsere gespeicherten Änderungen erfolgreich an.
git stash pop
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.
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
Wir stecken einige Änderungen in diesen Zweig.
git stash -m "Change file5.txt in local branch"
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
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.
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
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.
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.
Wir wenden jetzt unsere gespeicherten Änderungen an.
git stash pop
Wir sehen dieses Mal, dass die versteckten Änderungen erfolgreich angewendet werden.
Wir haben die Konflikte gelöst und die gespeicherten Änderungen erfolgreich zusammengeführt.
Ressourcen:
- https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
- https://www.theserverside.com/video/How-to-easily-merge-and-resolve-git-stash-pop-conflicts
- https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
- https://newbedev.com/git-stash-blunder-git-stash-pop-and-ended-up-with-merge-conflicts
- https://stackoverflow.com/questions/4778882/how-to-launch-and-edit-a-file-from-git-using-notepad