繁体   English   中英

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

[英]Removing a specific commit in git history that includes merges

我想删除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 ,这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上的其他问题似乎并没有考虑到这个非常具体的情况,所以几乎可以说,这不是一个重复的问题。)

看起来它可能是git-rebase--interactive一个小错误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

解决方案/解决方法:(对我而言,无论如何)这似乎是git rebase一个错误。 我恢复到git 1.7.9,我的问题解决了; git rebase --interactive --preserve-merges完全符合我的要求,并生成我在帖子中指出的图表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM