Mercurial 撤消一系列提交

Mercurial undo a series of commits

我在功能分支上有一个具有以下历史记录(最近提交在顶部)的 mercurial 回购:

mergeDefaultA
|
mergeDefaultB
|
C
|
mergeDefaultD

mergeDefaultXXXX 是将默认分支合并到功能分支的合并提交。

发生的事情是提交 C 被搞砸了,但是直到我将 mergeDefaultA 推送到 Bitbucket 之后才注意到这一点。我要的是下图:

exactlyWhatIsInMergeDefaultD
| 
mergeDefaultA
|
mergeDefaultB
|
C
|
mergeDefaultD

其中 exactlyWhatIsInMergeDefaultD 字面意思就是 mergeDefaultD 中代码的状态。但是,everything I'm reading 似乎表明您无法撤消像这样的一系列提交(只有一次提交返回),即使如此,一旦您按下 "into the wild",许多选项也不可用.

如何实现?

如果这是 git,我会这样做:

git revert mergeDefaultD

如何在 Mercurial 中执行相同的操作?

这是我认为你想要的:

hg revert -r GOOD_REVISION_NUMBER --all
hg commit -A -m "reverting back to revision GOOD_REVISION_NUMBER"

一旦提交,只要有人从你那里拉(或你推给他们)他们就会得到最新的修订版,只包含好东西。如果他们真的想回到坏东西,你可以随时更新到那个版本:

hg update -r BAD_REVISION_NUMBER

扩展一下 Harvtronix 的回答(顺便说一下,这很好):

一个简单的方法是恢复到旧版本号 ('GOOD') 并提交。注意:还原意味着您将文件设置为与修订 'GOOD' 中相同的内容,您不会沿着树向下返回到该提交。如果你这样做,你确实会分叉并有两个头。

hg revert -r GOOD --all
hg commit -m "all is good now"

另一种方法是只丢弃版本 C(如果我没看错你的解释,实际上是 C 导致了这个问题)。 'hg backout' 将在您的工作目录中引入 C 的反向,因此您可以提交它。

hg backout -r C
hg commit -m "Backed out C"

最后,最后一个选择是关闭坏分支,更新到最后一次正常的提交并在那里进一步提交:

hg up -r BAD
hg commit --close-branch -m "This head is bad"
hg up -r GOOD
... continue here ...