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

Sop*_*ert 7 git version-control mercurial

使用git,我可以使用像这样的命令丢弃错误或意外的提交

git reset --soft HEAD^
Run Code Online (Sandbox Code Playgroud)

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

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

git reset --hard 53b94d0
Run Code Online (Sandbox Code Playgroud)

这让我完全回到了承诺53b94d0,好像我之后从未做过任何事情.

什么是Mercurial(hg)等价物?

Sop*_*ert 19

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

hg rollback

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

hg rollback
Run Code Online (Sandbox Code Playgroud)

这将取消提交(不触及工作树 - 您应该能够使用hg revert --all或者hg update -C如果您想要重置整个工作目录).

hg clone -r

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

hg clone -r 77182fb7451f giraffe new-giraffe
cp giraffe/.hg/hgrc new-giraffe/.hg/
Run Code Online (Sandbox Code Playgroud)

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

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

hg strip

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

[extensions]                                                                    
mq =
Run Code Online (Sandbox Code Playgroud)

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

hg strip 1cc72d33ea76
Run Code Online (Sandbox Code Playgroud)

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

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

hg strip使用revsets

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

hg strip "ancestors(.) and not ancestors(77182fb7451f)"
Run Code Online (Sandbox Code Playgroud)

确保首先运行:

hg log -r "ancestors(.) and not ancestors(77182fb7451f)"
Run Code Online (Sandbox Code Playgroud)

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