Mercurial还原,然后重新应用变更集

时间:2011-04-05 17:57:16

标签: mercurial

我已经提交了A,B,C,D和E.我意识到在提交B中发生了一些非常糟糕的事情,所以我想恢复到A,这次更改正确,之前搞砸了B,然后自动重新应用C,D和E.

你可能想知道我为什么不回到B并在那里修复,然后重新回到E(这是一个好主意吗?)。原因我不太了解,但它与一组特殊的视觉工作室文件中出现的问题(应该只通过视觉工作室中的某些GUI屏幕进行编辑)有关,这些文件不能简单地纠正发生错误后的文件...如果我知道它们,我会提供更多详细信息

3 个答案:

答案 0 :(得分:5)

只需退出你在B中所做的事情并将其作为F提交。这样,历史将完好无损,而你的同行将在不必知道的情况下获得变更。

如果B是服务版本,请在那里进行更改,然后将其合并到F中。

答案 1 :(得分:4)

这可以使用Mercurial Queues(mq)完成。你想要:

  1. 将变更集B到E导入到mq
  2. 取消应用更改集C到E
  3. 修复变更集B并刷新补丁
  4. 通过E重新申请C
  5. 完成补丁
  6. 这样做如下:

    1. cd <project>
    2. hg qinit
    3. hg qimport --rev B:E
    4. hg qpop --all
    5. hg qpush <patch name for B>
    6. ...解决您在B
    7. 中发现的问题
    8. hg qrefresh
    9. hg qpush --all
    10. hg qfinish --applied
    11. 这一切都假设B到E还没有被推送到任何公共存储库。如果他们已被推,那么你最好的办法就是在新的变更集(F)中解决问题。

答案 2 :(得分:3)

您也可以使用HisteditExtension(而不是MqExtension)。 MqExtension更强大,但我认为它也更复杂。 HisteditExtension有点像git rebase --interactive

# Ordinarily it would be something like (I'd normally do -r -5, instead):
hg histedit d0844102a010

您的文本编辑器将打开一个如下所示的文件:

pick d0844102a010 A
pick a9448f0ba534 B
pick b754f9f2513b C
pick 736f7f2363ff D
pick 05bb58f48597 E

# Edit history between d0844102a010 and 05bb58f48597
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  f, fold = use commit, but fold into previous commit
#  d, drop = remove commit from history
#

每一行对应一次提交。第一个单词指的是要应用于该提交的命令。默认的“选择”只保持提交不变。使用“编辑”进行更改(包括提交日志更改),“折叠”以将其与先前的提交相结合,并使用“删除”将其完全删除。

在您的情况下,您可能只需要将第一行更改为“编辑”。

请记住,必须使用hg histedit --continue而不是hg commit(如果您正在“编辑”或存在合并冲突)。 :)如果您遇到冲突且事情看起来不太好而您只想取消,那么您可以使用hg histedit --abort

# Fix up files...
vim foo bar baz

# Finished; apply the changes (and pray for a clean merge ;).
hg histedit --continue

当然,自担风险编辑历史记录。我建议您在编辑历史记录之前创建源树的备份tarball或zip,直到您熟悉这些命令。