Mercurial撤消一系列提交

时间:2015-03-09 22:49:06

标签: mercurial revert

我在功能分支上有以下历史(顶部最近提交)的mercurial repo:

mergeDefaultA
|
mergeDefaultB
|
C
|
mergeDefaultD

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

发生的事情是提交C被搞砸了,但是在我将mergeDefaultA推到Bitbucket之后才发现这一点。我想要的是以下图片:

exactlyWhatIsInMergeDefaultD
| 
mergeDefaultA
|
mergeDefaultB
|
C
|
mergeDefaultD

其中exactlyWhatIsInMergeDefaultD确切地说是mergeDefaultD中代码的状态。但是,everything I'm reading似乎表明您无法撤消这样的一系列提交(只返回一次),即使这样,一旦您推入“野外”,许多选项也无法使用

我如何实现这一目标?

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

git revert mergeDefaultD

我如何在Mercurial中做同样的事情?

2 个答案:

答案 0 :(得分:4)

这是我认为你想要的:

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

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

hg update -r BAD_REVISION_NUMBER

答案 1 :(得分:1)

要扩展一下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 ...