
Ich habe also einen ziemlich großen Fehler gemacht. Ich habe ein Commit durchgeführt, gezogen, zusammengeführt (aber dabei den Code durcheinandergebracht) und dann gepusht. Ich würde das Zusammenführen gerne wiederholen und den Code richtig machen. Gibt es eine Möglichkeit, das zu tun?
Ich verwende Bitbucket.
Antwort1
Ich bin nicht sicher, ob dies die „gesegnete“ Art ist, es zu tun, aber so habe ich das gleiche Problem gelöst, ohne „Force Push“ oder ähnliches Grobes durchführen zu müssen.
Nehmen wir an, Ihr Verlauf sieht ungefähr so aus (und M ist die verpatzte Zusammenführung):
-A--B--C--M (master points here)
\ /
D----E
Durch Ausführen git checkout -b merge_fix <commit ID E>
wird ein Zweig erstellt, bevor wir Fehler machen:
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
Lassen Sie uns nun den Merge in unserem neuen Zweig wiederholen. Wir können nicht einfach in zusammenführen master
, also müssen wir das Commit vor unserem fehlerhaften Merge manuell auswählen: git merge <commit ID C>
Machen Sie nicht dieselben Fehler wie beim letzten Mal!
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
Vorausgesetzt, das Commit G
sieht gut aus, wollen wir jetzt mit dem oberen Ende des Zweigs synchronisieren master
. Dieser Befehl weist Git an, die am Master vorgenommenen Änderungen zu ignorieren und unsere Änderungen als Merge-Ergebnis zu verwenden:git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
Abschließend (wiederum vorausgesetzt, dass das Commit H
gut aussieht) wollen wir schnell vorspulen, master
um unseren behobenen Merge einzuschließen:
git checkout master
git merge merge_fix
master
Dadurch wird der Verzweigungszeiger eigentlich nur nach verschoben H
, aber ich werde die Gelegenheit nutzen, um meine ASCII-Grafik ein wenig aufzuräumen:
-A--B--C--M--H (HEAD, master, and merge_fix all point here)
\ X /
D----E--G
Und da haben Sie es! Sie haben die Zusammenführung erfolgreich wiederholt, ohne den Verlauf ungültig zu machen!
Antwort2
Sie können es folgendermaßen machen:
- Setzen Sie es auf das Commit vor dem Zusammenführen zurück.
- Führen Sie die Zusammenführung erneut durch
- Kraftschub
Das ist:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Denken Sie daran, dass git push --force
dadurch alles neu geschrieben wird, was Sie im Remote-Zweig hatten, und dass auch andere Benutzer dieses Zweigs hiervon betroffen sein können. (Normalerweise sollten Sie dies nicht tun.)
Antwort3
git merge --abort
und dann können Sie wieder zusammenführen
Antwort4
Ich hatte ein anderes, etwas komplizierteres Setup.
Es gibt grundsätzlich drei Ausgangspunkte: (und die anderen Lösungen gehen alle von 1 oder 2 aus)
redo-branch
sollte vollständig zusammengeführt werden UND
nach der Zusammenführung vonredo-branch
gab eskeine weiteren Zusammenführungenredo-branch
sollte vollständig zusammengeführt werden UND
nach der Zusammenführung vonredo-branch
gab es bereitsandere Zusammenschlüsse, das sollte beibehalten werdenredo-branch
ist einlanglebiger Zweigwiederholt zusammengeführt werden UND
nur eine Reihe von RevisionenWarTeil der FusionUND
es gabandere Commits/Merges auf Masternach der fehlgeschlagenen Zusammenführung (Autsch)
Ein Setup für (3) wäre
---A--B--C--M (master points here)
/ /
-X--D-----E--Y (that's the long-living redo-branch)
- Sie sollten mit der Lösung zufrieden seinhttps://superuser.com/a/691497/308385
- gleiche Lösung wie 1 könnte funktionieren
- Lass uns anfangen :-)
# let's start on the last commit before the failed merge
git checkout redo-branch
git checkout -b D^1 new-branch-for-merge
# now let's pick all the revisions D through E
git cherry-pick D^1..E
# go to the target branch (master) and merge
git checkout master
git merge new-branch-for-merge