7

使用 git,我可以使用类似的命令丢弃错误或意外的提交

git reset --soft HEAD^

它将当前分支(例如master)重置为当前修订的父提交HEAD^,而不触及工作树 -如果您也想删除工作树,您可以替换为--soft--hard

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

git reset --hard 53b94d0

这让我回到了提交 53b94d0 的状态,就好像在那之后我从未提交过任何事情一样。

什么是汞 (hg) 等价物?

4

1 回答 1

19

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

hg回滚

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

hg rollback

hg revert --all这将撤消提交(它不会触及工作树 - 如果您也hg update -C想重置整个工作目录,您应该能够跟随它)。

hg克隆-r

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

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

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

这比从 Internet 重新克隆要快,因为它仅将文件复制到本地磁盘上(在许多系统上,硬链接它们以节省更多时间和空间),但如果您的存储库很大,仍然可能非常耗时。

汞条

如果您想通过修改提交历史来做更复杂的事情(顺便说一下,这在 hg 世界中有点不受欢迎),首先通过将以下行添加到您的(无需指定路径)来启用Mercurial Queues 扩展.hgrc等号后):

[extensions]                                                                    
mq =

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

hg strip 1cc72d33ea76

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

不幸的是,使用这种方法通常很难删除完全正确的变更集,而且很容易得到多个头(您可以使用查看hg heads),需要繁琐的重复应用hg strip才能到达您想要的位置额外的头。

使用 revsets 的 hg 条带

使用hg revsets您可以使用以下命令删除.(当前修订版)的所有祖先,这些祖先不是您要恢复到的修订版的祖先:

hg strip "ancestors(.) and not ancestors(77182fb7451f)"

确保首先运行:

hg log -r "ancestors(.) and not ancestors(77182fb7451f)"

这将向您显示所有hg strip将删除的变更集,因此您可以确保不会对您的提交历史造成不可挽回的损害(因为您有备份......对吗?)。

于 2012-07-04T04:44:15.263 回答