Nehmen Sie den folgenden Fall:
Ich habe einige Arbeiten in einem Themenbereich und bin jetzt bereit, wieder zum Master zurückzukehren:
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
Ich führe die Zusammenführung vom Master durch, löse die Konflikte und jetzt habe ich:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | eb3b733 3 [origin/master]
|/
* 38abeae 1
Jetzt hat die Zusammenführung einige Zeit in Anspruch genommen, sodass ich einen weiteren Abruf durchführe und feststelle, dass der Remote-Master-Zweig neue Änderungen aufweist:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
| | * e7affba 4 [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
Wenn ich 'git rebase origin / master' von master versuche, bin ich gezwungen, alle Konflikte erneut zu lösen, und ich verliere auch das Merge-Commit:
* d4de423 2 [master]
* e7affba 4 [origin/master]
* eb3b733 3
| * b62cae6 2 [topic]
|/
* 38abeae 1
Gibt es eine saubere Möglichkeit, das Zusammenführungs-Commit neu zu definieren, damit ich einen Verlauf wie den unten gezeigten erhalte?
* 51984c7 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | e7affba 4 [origin/master]
* | eb3b733 3
|/
* 38abeae 1
git
merge
rebase
git-rebase
git-rewrite-history
Jipumarino
quelle
quelle
git rebase --preserve-merges origin/master
git config --global pull.rebase preserve
um die Merge Commits während einer Rebase immer zu bewahrengit --rebase-merges
wird letztendlich das alte ersetztgit --preserve-merges
. Siehe Was genau machtrebase --preserve-merges
--preserve-merges
ist veraltet. Verwenden Siegit rebase --rebase-merges origin/master
Antworten:
Hier gibt es zwei Möglichkeiten.
Eine besteht darin, eine interaktive Rebase durchzuführen und das Zusammenführungs-Commit zu bearbeiten, die Zusammenführung manuell zu wiederholen und die Rebase fortzusetzen.
Eine andere
--rebase-merges
Möglichkeit besteht darin, die Option on zu verwendengit rebase
, die im Handbuch wie folgt beschrieben wird: "Standardmäßig löscht eine Rebase einfach Zusammenführungs-Commits aus der Aufgabenliste und fügt die neu basierten Commits in einen einzelnen linearen Zweig ein. Mit --rebase- Beim Zusammenführen versucht die Neuausrichtung stattdessen, die Verzweigungsstruktur innerhalb der neu zu basierenden Commits beizubehalten, indem die Zusammenführungs-Commits neu erstellt werden. Alle gelösten Zusammenführungskonflikte oder manuellen Änderungen in diesen Zusammenführungs-Commits müssen manuell gelöst / erneut angewendet werden. "quelle
Ok, das ist eine alte Frage, die bereits beantwortet wurde
@siride
, aber diese Antwort hat in meinem Fall nicht ausgereicht, da--preserve-merges
Sie gezwungen sind, alle Konflikte zum zweiten Mal zu lösen. Meine Lösung basiert auf der Idee,@Tobi B
aber mit genauen Schritt-für-Schritt-BefehlenWir beginnen also mit einem solchen Zustand anhand eines Beispiels in der Frage:
Beachten Sie, dass wir 2 Commits vor uns haben, sodass Cherry-Pick nicht funktionieren würde.
Lassen Sie uns zunächst den richtigen Verlauf erstellen, den wir möchten:
Wir verwenden
--preserve-merges
, um unser Merge-Commit in der Geschichte zu speichern. Wir--strategy=ours
ignorieren alle Zusammenführungskonflikte, da es uns egal ist, welche Inhalte in diesem Zusammenführungs-Commit enthalten sind. Wir brauchen jetzt nur einen schönen Verlauf.Die Geschichte wird so aussehen (Meister ignorieren):
Lassen Sie uns jetzt den richtigen Index erhalten.
Es kann sein, dass hier einige zusätzliche Zusammenführungskonflikte auftreten. Dies sind jedoch nur Konflikte aus Dateien, die zwischen
8101fe3
und geändert wurdenf5a7ca8
, aber nicht bereits gelöste Konflikte austopic
Der Verlauf sieht folgendermaßen aus (ohne Berücksichtigung des korrekten Verlaufs):
Die letzte Phase besteht darin, unseren Zweig mit der richtigen Historie und den Zweig mit dem richtigen Index zu kombinieren
Wir verwenden
reset --soft
, um unseren Zweig (und den Verlauf) auf den korrekten Verlauf zurückzusetzen, lassen jedoch den Index und den Arbeitsbaum unverändert. Danncommit --amend
schreiben wir unser Merge-Commit, das früher einen falschen Index hatte, mit unserem guten Index vom Master neu.Am Ende werden wir einen solchen Status haben (beachten Sie eine andere ID von Top Commit):
quelle
git commit --amend
fügt die Änderungen zum letzten Commit hinzu (HEAD, in diesem Fall das Merge-Commit). Da sich der Commit-Inhalt ändert, wird der Hash aktualisiert.Angesichts der Tatsache, dass ich gerade einen Tag verloren habe, um dies herauszufinden, und tatsächlich mit Hilfe eines Kollegen eine Lösung gefunden habe, dachte ich, ich sollte mich einschalten.
Wir haben eine große Codebasis und müssen uns mit 2 Zweigen befassen, die gleichzeitig stark modifiziert werden. Es gibt einen Hauptzweig und einen Nebenzweig, wenn Sie welche.
Während ich den sekundären Zweig mit dem Hauptzweig zusammenführe, wird die Arbeit im Hauptzweig fortgesetzt, und bis ich fertig bin, kann ich meine Änderungen nicht mehr übertragen, da sie nicht kompatibel sind.
Ich muss daher meine "Zusammenführung" "neu gründen".
So haben wir es endlich gemacht:
1) notieren Sie sich die SHA. Beispiel: c4a924d458ea0629c0d694f1b9e9576a3ecf506b
2) Erstellen Sie den richtigen Verlauf, aber dadurch wird die Zusammenführung unterbrochen.
3) notieren Sie sich die SHA. Beispiel: 29dd8101d78
4) Setzen Sie nun zurück, wo Sie vorher waren
5) Führen Sie nun den aktuellen Master in Ihrem Arbeitszweig zusammen
6) Nachdem Sie nun die richtigen Dateien, aber den falschen Verlauf haben, erhalten Sie den richtigen Verlauf zusätzlich zu Ihrer Änderung mit:
7) Und dann - ändern Sie die Ergebnisse in Ihrem ursprünglichen Zusammenführungs-Commit
Voila!
quelle
Es sieht so aus, als ob Sie Ihre erste Zusammenführung entfernen möchten. Sie können wie folgt vorgehen:
Das würde dir geben, was du willst.
quelle
quelle