使用 git,我可以使用类似的命令丢弃错误或意外的提交
git reset --soft HEAD^
它将当前分支(例如master
)重置为当前修订的父提交HEAD^
,而不触及工作树 -如果您也想删除工作树,您可以替换为--soft
。--hard
另外,如果我想摆脱多个提交,我可以使用类似的命令
git reset --hard 53b94d0
这让我回到了提交 53b94d0 的状态,就好像在那之后我从未提交过任何事情一样。
什么是汞 (hg) 等价物?
使用 git,我可以使用类似的命令丢弃错误或意外的提交
git reset --soft HEAD^
它将当前分支(例如master
)重置为当前修订的父提交HEAD^
,而不触及工作树 -如果您也想删除工作树,您可以替换为--soft
。--hard
另外,如果我想摆脱多个提交,我可以使用类似的命令
git reset --hard 53b94d0
这让我回到了提交 53b94d0 的状态,就好像在那之后我从未提交过任何事情一样。
什么是汞 (hg) 等价物?
尽管 Mercurial 没有提供简单的替代方案并且回避可变历史的想法,但有几种方法可以实现接近的目标。在这篇文章中,我将概述其中的一些。
如果您特别想撤消上一次提交,可以使用:
hg rollback
hg revert --all
这将撤消提交(它不会触及工作树 - 如果您也hg update -C
想重置整个工作目录,您应该能够跟随它)。
假设您要将调用的存储库重置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
才能到达您想要的位置额外的头。
使用hg revsets您可以使用以下命令删除.
(当前修订版)的所有祖先,这些祖先不是您要恢复到的修订版的祖先:
hg strip "ancestors(.) and not ancestors(77182fb7451f)"
确保首先运行:
hg log -r "ancestors(.) and not ancestors(77182fb7451f)"
这将向您显示所有hg strip
将删除的变更集,因此您可以确保不会对您的提交历史造成不可挽回的损害(因为您有备份......对吗?)。