Ich bin mir nicht sicher, ob dies der "gesegnete" Weg ist, aber hier ist, was ich getan habe, um das gleiche Problem zu lösen, ohne "Push" oder ähnliches erzwingen zu müssen.
Nehmen wir an, Ihre Historie sieht ungefähr so aus (und M ist die überflüssige Zusammenführung):
-A--B--C--M (master points here)
\ /
D----E
Beim Laufen git checkout -b merge_fix <commit ID E>
wird ein Zweig erstellt, bevor wir Fehler gemacht haben:
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
Lassen Sie uns nun die Zusammenführung in unserer neuen Niederlassung wiederholen. Wir können nicht einfach zusammenführen master
, daher müssen wir den Commit vor dem Zusammenführen manuell auswählen: git merge <commit ID C>
Machen Sie nicht die gleichen Fehler, die Sie das letzte Mal gemacht haben!
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
Vorausgesetzt, das Commit G
sieht gut aus, möchten wir es jetzt mit der Spitze des master
Zweigs synchronisieren . Dieser Befehl weist git an, die Änderungen, die am Master vorgenommen wurden, zu ignorieren und zu erzwingen, dass unsere Änderungen zum Merge-Ergebnis werden:git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
Schließlich H
möchten wir (wieder unter der Annahme, dass Commit gut aussieht) einen schnellen Vorlauf durchführen master
, um unsere feste Zusammenführung einzuschließen:
git checkout master
git merge merge_fix
Das verschiebt wirklich nur den master
Verzweigungszeiger H
, aber ich werde die Gelegenheit nutzen, 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 hast du es! Sie haben die Zusammenführung erfolgreich wiederholt, ohne einen Verlauf ungültig zu machen.