回滚存储库到特定版本

时间:2011-02-25 22:37:02

标签: version-control mercurial

我遇到了存储库问题。我从另一个存储库中提取了一个变更集列表,运行了更新并合并了...合并没有按预期工作,现在我需要回滚到之前我拉动变更集只是为了再次拉动它们。

如何将多个变更集回滚到特定版本?

4 个答案:

答案 0 :(得分:3)

如果在此上下文中“回滚”意味着要删除变更集,就好像从未拉过,那么可以使用MQ扩展的“strip”函数部分。

首先通过编辑.hgrc(* nix)或mercurial.ini(Windows)文件来启用MQ扩展:

[extensions]
mq=

然后使用strip命令:

hg strip REV

警告:这将删除带有给定版本哈希的变更集,以及随后的任何变更集。如果您不确定要完成什么或如何使用该命令,请在尝试之前复制存储库,这样您就可以安全地进行实验。

另请注意,如果您已将合并推送到其他位置,那么您也可以在该存储库中进行清理,并且根据合并是否“在野外”,可能无法永久删除它的。

答案 1 :(得分:2)

回滚不是您所描述的。如果在拉动你的回购之前看起来像这样:

[A]-[B]-[C]-[D]
拉后看起来像是:

[A]-[B]-[C]-[D]
          \
           -[E]-[F]

在合并之后它看起来像这样:

[A]-[B]-[C]-[D]-----[G]
          \        /
           -[E]-[F]

然后你不想撤消拉动 - 你仍然想要变更集E和F - 你只想在合并时再试一次,G。

有几种方法可以做到这一点。最 Mercurial 方法就是这样做:

hg update D
hg merge E
... re-merge, doing it better this time ...
hg commit # creates H

然后您的历史记录如下:

[A]-[B]-[C]-[D]-------- [G]
          \          X
           -[E]-[F]-----[H]

其中X是十字路口。然后,您将使用H作为新的开发点并忽略(或关闭G)。

第二,最好删除G然后重新进行合并。这样做的官方方法是在本地克隆您的存储库,获取除G以外的所有内容:

cd ..
hg clone -r tip-1 myrepo mynewrepo

然后你将拥有mynewrepo中的所有内容,除了G.你可以重新合并。 strip命令也有效,但由于某种原因它被禁用。

底线是你不需要移除和重做拉;只是合并。

答案 2 :(得分:1)

我还没有真正使用mercurial,只有真正的CVS和SVN,但它应该是相同的。我假设您可以根据修订号或日期签出旧版本,对吗?如果是这样,请检查临时目录中的旧版本并重新合并。您还需要删除存储库中添加的任何新文件。这样你就可以有效地获得与2个或更多版本相同的文件副本。

这与回滚具有相同的效果,但它将是更高的版本号。相同的内容,只是一个较新的版本。我认为这是最安全的方法,因为没有办法放松任何东西。

答案 3 :(得分:0)

如果要返回特定修订并放弃所有本地更改,只需更新到修订版并传递清除标记:

hg up -C -R 7

此行放弃未提交的更改并恢复为修订版7,作为示例。