使用git,我可以使用像
这样的命令丢弃错误或意外的提交git reset --soft HEAD^
将当前分支(例如master
)重置为当前修订版的父提交HEAD^
而不触及工作树 - 如果您将--soft
替换为--hard
我也希望抹掉工作树。
另外,如果我想摆脱多个提交,我可以使用像
这样的命令git reset --hard 53b94d0
这让我完全回到提交53b94d0,好像我之后从未做过任何事情。
Mercurial(hg)的等价物是什么?
答案 0 :(得分:19)
尽管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
是必要的,以确保新长颈鹿paths
(如git的“遥控器”)正确指向原始仓库,而不是默认情况下指向giraffe
文件夹。)
这比从互联网重新登记更快,因为它只会在磁盘上本地复制文件(在许多系统上,硬链接它们以节省更多时间和空间),但如果您的存储库仍然非常耗时很大。
如果你想通过修改提交历史来做更复杂的事情(顺便说一句,这在hg世界中有些不受欢迎),首先通过在{{1}添加以下行来启用Mercurial Queues extension (不需要在等号后指定路径):
.hgrc
这为您(以及其他有用的东西)提供了[extensions]
mq =
命令,可以从存储库中完全删除变更集及其所有后代。因此,您可以使用如下命令:
hg strip
如果1cc72d33ea76是您要删除的存储库中的第一个“坏”变更集。
不幸的是,使用这种方法通常很难删除正确的变更集,并且很容易最终得到多个头(您可以使用hg strip 1cc72d33ea76
查看),需要繁琐的重复应用{{1}在你没有额外的头脑之前,你可以到达你想去的地方。
使用hg revsets您可以删除hg heads
(当前版本)的所有祖先,这些祖先是不您想要恢复的修订版的祖先,使用类似的命令:
hg strip
确保首先运行:
.
会显示hg strip "ancestors(.) and not ancestors(77182fb7451f)"
将删除的所有更改集,因此您可以确保不会无法修复您的提交历史记录(因为您有备份......对吗?)。