我如何在Mercurial上重置--hard HEAD?

时间:2010-04-20 04:03:05

标签: git mercurial merge dvcs

我是一个试图使用Mercurial的Git用户。

以下是发生的事情:我对我想要恢复的变更集做了hg backout。这创造了一个新头,所以hg指示我合并(回到“默认”,我假设)。合并后,它告诉我,我仍然必须承诺。然后我注意到在解决合并中的冲突时我做错了一些事情,并且我决定在hg backout之前拥有所有内容,也就是说,我希望这个未经修改的合并消失。在Git上,这个未提及的东西将在索引中,我只是做一个git reset --hard HEAD来消除它,但是,从我读过的,Mercurial上不存在索引。那我该怎么退出呢?

4 个答案:

答案 0 :(得分:87)

如果您尚未提交,并且听起来没有,则可以撤消与hg update --clean的所有合并工作。

然而,在较新的mercurial中,有一个方便的命令来重新合并单个文件:hg resolve path/to/file.ext。来自hg help resolve

The available actions are: ...

 4) discard your current attempt(s) at resolving conflicts and
     

重启            从头开始合并:“hg resolve file ...”(或“-a”表示所有            未解决的文件)

答案 1 :(得分:21)

这很接近:

hg update --clean

答案 2 :(得分:11)

Hg手册的GitConcepts页面介绍了如何在Mercurial中使用git个用户熟悉的操作。

Mercurial没有任何内置的git reset --hard行为。但是,strip扩展名提供了strip命令。要在~/.hgrc文件中使用first enable strip ::

[extensions]
strip =

注意:此扩展程序在Mercurial 2.8中以新的形式发布。先前版本在mq extension中提供了strip命令。

现在您可以运行hg strip甚至hg help strip等命令。要删除变更集及其所有子项,只需将变更集指定为hg strip的参数即可。例如,要删除刚刚进行的上一次提交(在使用导致hg rollback报告不再有要回滚的事务的命令之后),可以删除tip修订版。每次运行此命令时,都将删除另一个修订。 hg strip的行为应被视为不可逆转;不熟悉的用户在使用之前应该备份他们的存储库。

$ hg strip tip

例如,对于revsets syntax,我表示我想删除我的任何提交,这会导致在运行hg heads时显示额外的头部。如果在tip以外的表达式中指定特定修订,则将修剪当前分支中不是所选修订版本祖先的所有内容。当我发出命令git reset --hard HEAD时,这似乎最接近我想要的行为。

$ hg strip "branch(tip) and not(ancestors(tip)::tip)"

答案 3 :(得分:8)

从git,命令:

git reset --hard     # reset to last commit    
git clean -df        # delete untracked files

等于

hg update --clean    # reset to last commit  
hg purge             # delete untracked files