尽管Mercurial没有提供简单的替代方案并且回避可变历史的想法,但有几种方法可以实现类似的功能。在本文中,我将概述其中的一些方法。
hg rollback
如果你想撤销最后一次提交,可以使用以下命令:
hg rollback
这将撤销提交(不会影响工作树 - 如果您想要重置整个工作目录,您应该能够使用hg revert --all
或hg update -C
跟随它)。
hg clone -r
假设您想要将名为giraffe
的存储库重置为版本77182fb7451f。如果您进入父目录并运行:
hg clone -r 77182fb7451f giraffe new-giraffe
cp giraffe/.hg/hgrc new-giraffe/.hg/
然后您将得到一个名为new-giraffe的仓库,它的版本是77182fb7451f。(cp
命令是必需的,以确保new-giraffe paths
(类似于git的“remotes”)指向正确的源仓库,而不是默认情况下指向giraffe
文件夹。)
这比重新从互联网克隆要快,因为它只在本地磁盘上复制文件(并在许多系统上使用硬链接以节省更多时间和空间),但如果您的存储库很大,则仍可能需要花费很长时间。
hg strip
如果您想对修改提交历史进行更复杂的操作(顺便说一句,这在hg世界中有些受到反感),请首先通过将以下行添加到您的.hgrc
文件来启用Mercurial Queues extension(等号后面不需要指定路径):
[extensions]
mq =
这将为您提供(除其他有用的工具外)
hg strip
命令,完全从存储库中删除变更集及其所有后代。因此,您可以使用类似以下的命令:
hg strip 1cc72d33ea76
如果1cc72d33ea76是您想要删除的代码库中第一个“坏”变更集。
不幸的是,使用这种方法精确地删除正确的变更集通常很困难,而且很容易出现多个分支(您可以使用hg heads
查看),需要反复应用hg strip
才能到达您想要的目标且没有额外的分支。
使用revsets进行hg strip
使用hg revsets,您可以删除 .
(当前版本)的所有祖先,这些祖先不是要还原到的版本的祖先,使用类似以下命令:
hg strip "ancestors(.) and not ancestors(77182fb7451f)"
确保先运行:
hg log -r "ancestors(.) and not ancestors(77182fb7451f)"
这将向您展示所有更改集,hg strip
将删除它们,因此您可以确保不会对提交历史造成无法挽回的损害(因为您有备份……对吧?)。