我遇到了存储库问题。我从另一个存储库中提取了一个变更集列表,运行了更新并合并了...合并没有按预期工作,现在我需要回滚到之前我拉动变更集只是为了再次拉动它们。
如何将多个变更集回滚到特定版本?
答案 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,作为示例。