git - 删除包含 merge 的 git 历史记录中的特定提交

标签 git git-rebase

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

历史是这样的。在此示例中,我想删除单提交 merge 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 上的其他问题似乎并没有说明这个非常具体的案例,所以据我所知,这不是一个重复的问题。)

最佳答案

看起来它可能是 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 是一个merge 所以 cherry-pick 需要关于使用哪个父级的提示。

不过,我不确定它为什么要尝试使用 m6

关于git - 删除包含 merge 的 git 历史记录中的特定提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18832309/

相关文章:

git - 在 Windows 7 上使用 git 的 GitHub 的 https 证书错误

git - 检查 AWS 中的应用程序设置

Git 缺少提交错误

Git rebase interactive 最后 n 次提交

git - 在 'git pull --rebase' 之后看不到远程更改

git - 我如何告诉 git(或其他一些 dvcs)私下跟踪文件?

git - `git fetch` 然后 `git rebase` 和 `git pull --rebase` 之间有什么区别?

Git,如何使用 rebase 自动化历史崩溃

java - 从 Java 代码执行 git rebase 交互

带有子分支的 git rebase master