删除包含合并的git历史记录中的特定提交

时间:2013-09-16 15:54:38

标签: git git-rebase

我想删除git历史记录中的特定提交C,以及一些单一提交合并。

历史看起来像这样。在此示例中,我想删除单一提交合并m6和有问题的提交C

---m0-------------------m1---m2---m3-------------m4---m5----m6---m7---(...)
     \                 /            \           /       \  /
      b0---b1---b2---b3              b4--(C)--b5         b6

我想结束这一点(突出显示更改):

                                                      vv 
---m0------------------m1---m2---m3---------m4---m5---b6---m7---(...)
    \                 /            \vvvvvvv/          ^^
     b0---b1---b2---b3              b4---b5
                                    ^^^^^^^

如果我使用“git rebase -i”来切换Cb6/m6,这可行,但我得到了:

---m0---b0---b1---b2---b3---m1---(...)---

历史被夷为平地。我想保留整个结构。相反,如果我使用--preserve-merges标志运行,那么我得到:

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>

我无法删除b6/m6(虽然我可以删除C)。

找到理想结果的最佳方法是什么?我正在使用git 1.8.4,如果这很重要。

(请注意,我在阅读的StackOverflow上的其他问题似乎并没有考虑到这个非常具体的情况,所以几乎可以说,这不是一个重复的问题。)

2 个答案:

答案 0 :(得分:0)

看起来它可能是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" "$@" ||
                            die_with_patch $sha1 "Could not pick $sha1"
                    ;;

当此次点击m6时,新的父级集合是单数,因此它会尝试使用cherry-pick,但m6是合并,因此cherry-pick需要提示使用哪个父母。

我不确定为什么它会尝试m6

答案 1 :(得分:0)

解决方案/解决方法:(对我来说,无论如何)这似乎是git rebase中的错误。我恢复到git 1.7.9,我的问题解决了; git rebase --interactive --preserve-merges完全按照我的意愿工作,并生成我在帖子中指出的图表。