回滚到Mercurial中的旧版本(如git reset)

时间:2012-07-04 04:44:14

标签: git version-control mercurial

使用git,我可以使用像

这样的命令丢弃错误或意外的提交
git reset --soft HEAD^

将当前分支(例如master)重置为当前修订版的父提交HEAD^而不触及工作树 - 如果您将--soft替换为--hard我也希望抹掉工作树。

另外,如果我想摆脱多个提交,我可以使用像

这样的命令
git reset --hard 53b94d0

这让我完全回到提交53b94d0,好像我之后从未做过任何事情。

Mercurial(hg)的等价物是什么?

1 个答案:

答案 0 :(得分:19)

尽管Mercurial没有提供一个简单的替代方案,并且不同于可变历史的概念,但有几种方法可以实现一些接近的目标。在这篇文章中,我将概述其中的一些内容。

hg rollback

如果您特别想撤消上次提交,可以使用:

hg rollback

将取消提交(不接触工作树 - 如果要重置整个工作目录,则应该能够使用hg revert --allhg update -C进行操作

hg clone -r

假设您要将名为giraffe的存储库重置为修订版77182fb7451f。如果您cd进入父目录并运行:

hg clone -r 77182fb7451f giraffe new-giraffe
cp giraffe/.hg/hgrc new-giraffe/.hg/

然后你最终会得到new-giraffe,一个修订版本为77182fb7451f的存储库。 (cp是必要的,以确保新长颈鹿paths(如git的“遥控器”)正确指向原始仓库,而不是默认情况下指向giraffe文件夹。)

这比从互联网重新登记更快,因为它只会在磁盘上本地复制文件(在许多系统上,硬链接它们以节省更多时间和空间),但如果您的存储库仍然非常耗时很大。

hg strip

如果你想通过修改提交历史来做更复杂的事情(顺便说一句,这在hg世界中有些不受欢迎),首先通过在{{1}添加以下行来启用Mercurial Queues extension (不需要在等号后指定路径):

.hgrc

这为您(以及其他有用的东西)提供了[extensions] mq = 命令,可以从存储库中完全删除变更集及其所有后代。因此,您可以使用如下命令:

hg strip

如果1cc72d33ea76是您要删除的存储库中的第一个“坏”变更集。

不幸的是,使用这种方法通常很难删除正确的变更集,并且很容易最终得到多个头(您可以使用hg strip 1cc72d33ea76 查看),需要繁琐的重复应用{{1}在你没有额外的头脑之前,你可以到达你想去的地方。

hg strip使用revsets

使用hg revsets您可以删除hg heads(当前版本)的所有祖先,这些祖先是您想要恢复的修订版的祖先,使用类似的命令:

hg strip

确保首先运行:

.

会显示hg strip "ancestors(.) and not ancestors(77182fb7451f)" 将删除的所有更改集,因此您可以确保不会无法修复您的提交历史记录(因为您有备份......对吗?)。