删除 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”删除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,如果这很重要的话。
(请注意,我仔细阅读过的 *** 上的其他问题似乎并没有说明这个非常具体的情况,所以据我所知,这不是一个重复的问题。)
【问题讨论】:
我下面的答案本身并不是一个真正的答案,但对于评论来说太大/需要格式化。我知道为此想出一个复制器会很痛苦,但是如果你可以想出一个,并且如果它是一个错误,那肯定会帮助 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 历史记录中包含合并的特定提交的主要内容,如果未能解决你的问题,请参考以下文章