在Mercurial中回滚到旧版本(类似于git reset)

7
使用git,我可以使用类似以下命令来丢弃错误或意外提交:
git reset --hard HEAD~1
git reset --soft HEAD^

这个命令将当前分支(如master)重置到当前修订版本的父提交HEAD^,而不会影响工作区——如果想要彻底清除工作区,可以将--soft替换为--hard

此外,如果我想要摆脱多个提交,可以使用类似的命令:

git reset --hard 53b94d0

这让我回到了53b94d0提交时的状态,就好像我在那之后从来没有提交过任何东西一样。

Mercurial(hg)中的等价命令是什么?

1个回答

19

尽管Mercurial没有提供简单的替代方案并且回避可变历史的想法,但有几种方法可以实现类似的功能。在本文中,我将概述其中的一些方法。

hg rollback

如果你想撤销最后一次提交,可以使用以下命令:

hg rollback

这将撤销提交(不会影响工作树 - 如果您想要重置整个工作目录,您应该能够使用hg revert --allhg 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 将删除它们,因此您可以确保不会对提交历史造成无法挽回的损害(因为您有备份……对吧?)。


那么,在hg中,重置等效的回滚/剥离不仅仅是改变分支标签指向的提交,还涉及到对数据库的一些实际修改? - jthill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接