5

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

历史看起来是这样的。在此示例中,我想删除 single-commit-mergem6和有问题的 commit 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”来切除Cand b6/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 的其他问题似乎并没有说明这个非常具体的情况,所以据我所知,这不是一个重复的问题。)

4

2 回答 2

0

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

于 2013-09-16T17:20:29.767 回答
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

于 2013-09-16T16:41:01.027 回答