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

Posted

技术标签:

【中文标题】删除 git 历史记录中包含合并的特定提交【英文标题】:Removing a specific commit in git history that includes merges 【发布时间】:2013-09-20 20:33:04 【问题描述】:

我想删除 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,如果这很重要的话。

(请注意,我仔细阅读过的 *** 上的其他问题似乎并没有说明这个非常具体的情况,所以据我所知,这不是一个重复的问题。)

【问题讨论】:

我下面的答案本身并不是一个真正的答案,但对于评论来说太大/需要格式化。我知道为此想出一个复制器会很痛苦,但是如果你可以想出一个,并且如果它是一个错误,那肯定会帮助 git 人员修复它。 :-) 【参考方案1】:

看起来这可能是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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于删除 git 历史记录中包含合并的特定提交的主要内容,如果未能解决你的问题,请参考以下文章

从 Git 历史记录中删除大文件

合并后的 Git 分支和提交历史记录

git删除所有提交历史记录

如何从 Git 历史记录中永久删除提交?

git删除所有历史提交记录

我可以使用 Git 以两种方式更改提交历史记录吗?