Ich möchte ein bestimmtes Commit, C, in git history sowie einige Single-Commit-Merges entfernen.Entfernen eines bestimmten Commits in git-Verlauf, der Zusammenführungen enthält
Die Geschichte sieht so aus. In diesem Beispiel möchte ich den Single-Commit-Merge m6
und einen problematischen Commit C
entfernen.
---m0-------------------m1---m2---m3-------------m4---m5----m6---m7---(...)
\ / \ / \/
b0---b1---b2---b3 b4--(C)--b5 b6
Ich möchte mit dieser aufzuwickeln (Änderungen hervorgehoben):
vv
---m0------------------m1---m2---m3---------m4---m5---b6---m7---(...)
\ / \vvvvvvv/ ^^
b0---b1---b2---b3 b4---b5
^^^^^^^
Wenn ich "git rebase -i" verwenden C
und b6/m6
auszuschneiden, das funktioniert, aber ich bekomme:
---m0---b0---b1---b2---b3---m1---(...)---
und der Verlauf ist abgeflacht. Ich möchte die gesamte Struktur erhalten. Umgekehrt, wenn ich mit der --preserve-merges
Flagge laufen, dann erhalte ich:
error: Commit <sha-1 corresponding to m6> is a merge but no -m option was given.
fatal: cherry-pick failed
Could not pick <sha-1 corresponding to m6>
und ich kann nicht entfernen b6/m6
(obwohl ich C entfernen).
Was ist der richtige Weg, um das gewünschte Ergebnis zu erzielen? Ich benutze Git 1.8.4, wenn das wichtig ist.
(Beachten Sie, dass die anderen Fragen auf Stackoverflow, dass ich für diesen sehr speziellen Fall, so wie fast zu berücksichtigen nicht perused scheinen, als ich sagen kann, ist dies nicht eine doppelte Frage.)
Meine Antwort unten ist nicht wirklich eine Antwort per se, aber ist zu groß/Needs-Formatierung für einen Kommentar. Ich weiß, dass es eine Qual wäre, einen Reproduzierer zu entwickeln, aber wenn Sie sich einen vorstellen können, und wenn es ein Fehler ist, wird das den Leuten helfen, die es reparieren. :-) – torek