我想删除 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”来删除 C
和 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
中的一个小错误:
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/