不使用反向补丁从分支中删除旧的Git提交?

33

我有一个类似这样的主分支...

A -- B -- C -- D -- E -- HEAD

有没有一种命令可以删除旧提交中的某个提交并保留其他提交,比如提交C?

最终变成这样:

A -- B -- D -- E -- HEAD

我知道我们可以使用反向补丁并应用一个新的反向补丁提交来删除提交 C,但是树形结构将不会那么清晰,看起来很笨重,即:

A -- B -- C -- D -- E -- C(apply reverse patch) -- HEAD

有人知道吗?

2个回答

44

使用交互式 rebase。例如,要返回 5 次提交:

git rebase -i HEAD~5

然后在弹出的编辑器中,删除包含您想要删除的提交的那一行。


12
惯常的警告:如果你已经在其他地方推广了,请不要这样做。 - manojlds
12
除非你确定只有你在使用遥控器,否则这个例外是惯例。 - Ryan Stewart
12
惯例补充说明一下,如果你通知了其他所有开发人员并且他们能够在他们的端解决这个问题,那么也是可能的。 - Paweł Obrok
@Graham:我发现它可以工作。但是在编辑器中,有不同的命令,我该如何应用这些命令?例如 squash、pick 等,除了仅删除提交行之外? - TheOneTeam
1
@Kit:只需阅读编辑器窗口底部显示的帮助文本。根据每个提交需要,将“pick”替换为“edit”或“squash”,或删除您不想要的行。 - Graham Borland
没有常规的 {警告,异常,附录},最好的方法是什么? - Jay B. Martin

8

交互式变基是有效的,但只需一个命令即可完成:

git rebase --onto B C

仍然可以看到“交互式变基”答案中的评论。这些评论也适用于此处。


执行此命令并出现冲突时,这意味着什么?你能提供一些实际的例子吗? - Fed
B和C是提交哈希值,而不是分支名称? - logicbloke
1
@logicbloke 二者皆可。分支名称仅是提交的友好别名。对于大多数通用的git命令,提供分支名称或提交哈希都是标识提交的可互换方式。请查看git help revisions以获取标识特定提交的许多其他方法。 - Ryan Stewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接