创建一个不包括一些旧的新提交

Create a new commit not including some old

所以,我在 Mercurial 中有一个存储库,如下图所示。我需要创建一个 new commitwithout changes 这是由两次提交完成的。让我们将这 2 个提交命名为 "commit 4" 和 "commit 16"。但我不能只是 "rewrite the history" 并删除这些提交。

根据我的理解,您想要执行以下操作:

  1. 取最顶层(最新)的变更集,我们称这个变更集为 23
  2. "Undo" 变更集 4 和变更集 16 在此基础上所做的任何事情

这给你:

  1. 变更集 23 仍然完好无损,包含变更集 4 和 16 所做的一切
  2. 你的新变更集应该是 23,除了没有任何变更集 4 和 16 所做的

操作方法如下,操作前的历史记录如下:

     23
     |
     ...
     |
     16
     |
     ...
     |
     4
     |
     ...
  1. 更新到最顶层的变更集
  2. 为变更集 4 创建回退变更集并提交,这将在变更集 23 之上提交
  3. 为变更集 16 创建一个 backount 变更集并提交,这将在变更集 24 之上提交

您的历史记录现在应该如下所示:

     25 (-16)
     |
     24 (-4)
     |
     23
     |
     ...
     |
     16
     |
     ...
     |
     4
     |
     ...

注意:

  • 变更集 23 仍包含变更集 4 和 16
  • 变更集 25 包含变更集 23,但来自 4 和 16 的更改已被撤销(撤销)
  • 如果 5 及更高版本中的更改依赖于变更集 4 中引入的更改,and/or 17 及更高版本中的更改依赖于变更集 16 中引入的更改,你将遇到合并冲突,你将需要处理这些冲突合并

答案很简单:backout 您不再需要或不想要的变更集:

hg backout -rXXX

其中 XXX 是您希望看到的变更集的修订版。因此,在您的情况下,首先检查您的最后一个变更集(例如 23),然后:

hg backout -r4
hg backout -r16

你的任务完成了。