[英]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”来切除C
和b6/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.