我想删除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
,这可行,但我得到了:
---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上的其他问题似乎并没有考虑到这个非常具体的情况,所以几乎可以说,这不是一个重复的问题。)
答案 0 :(得分:0)
看起来它可能是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
。
答案 1 :(得分:0)
解决方案/解决方法:(对我来说,无论如何)这似乎是git rebase
中的错误。我恢复到git 1.7.9,我的问题解决了; git rebase --interactive --preserve-merges
完全按照我的意愿工作,并生成我在帖子中指出的图表。