2013-09-16 26 views
5

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.)

+0

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

Antwort

0

wie es aussieht, kann ein kleiner Fehler sein in git-rebase--interactive:

  case "$new_parents" in 
      ' '*' '*) 
        test "a$1" = a-n && die "Refusing to squash a merge: $sha1" 
      ... snip ... 
      *) 
        output eval git cherry-pick "$strategy_args" "[email protected]" || 
          die_with_patch $sha1 "Could not pick $sha1" 
        ;; 

Wenn diese m6 trifft, der neue Satz von Eltern singulär ist, so versucht es cherry-pick zu verwenden, aber m6 ist eine Zusammenführung so cherry-pick erfordert einen Hinweis, welcher Elternteil zu verwenden .

Ich bin mir nicht sicher, warum es überhaupt versucht, m6 zu nehmen.

0

Lösung/Abhilfe: (für mich sowieso) Dies scheint ein Bug in git rebase. Ich kehrte zu Git 1.7.9 zurück und mein Problem wurde gelöst; git rebase --interactive --preserve-merges funktionierte genau so, wie ich es wollte und produziert die Graphik, die ich in meinem Post angegeben habe.

Verwandte Themen