如何在Mercurial上git reset --hard HEAD?


76

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

这是发生的事情:我hg backout对要还原的变更集进行了操作。那创造了一个新的头,所以hg指示我进行合并(我想回到“默认”)。合并后,它告诉我我仍然必须提交。然后,我注意到解决合并中的冲突时我做错了某些事情,并决定我希望像以前一样拥有所有东西hg backout,也就是说,我希望这种未提交的合并消失。在Git上,这些未提交的内容将包含在索引中,而我只是想git reset --hard HEAD删除它,但据我所读,该索引在Mercurial上不存在。那我该如何退出呢?


Answers:


94

如果您尚未提交,并且听起来好像还没有提交,则可以使用撤消所有合并工作hg update --clean

但是,在较新的版本中,有一个方便的命令可以重新合并单个文件: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”)


抱歉,我仍然有些困惑:我跑了hg up -C,但是“后退”提交仍然在我分支的顶端。我以为这是使用创建的“幽灵分支” backout,但是运行hg branchreturn default,所以我毕竟在主分支上?
Helder S Ribeiro

5
您可以具有相同分支的两个头,这就是您所拥有的。他们都被命名default。在水银中,这是非常正常的情况,而'hg heads是您用来发现/理解它的命令。当您运行hg backout它时,“将撤消的更改作为新的更改集提交”,这样就创建了一个新的更改集,并且不会花费很多精力。因此,现在在名为default的分支上都有两个头。完成hg merge并提交之后,您将回到名为default的分支上。
Ry4an Brase

24

这很接近:

hg update --clean


5
是的...虽然有时当您在文件中移动(从一个目录到另一个目录)然后决定暂存所有内容时,它做的工作与做的事情git reset --hard不同。
Ergo-轻率

13

从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

8
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
凯尔(Kyll)

git reset --hard不会删除未跟踪的文件。
Ruslan

对我不起作用。hg update --clean 18:8e139889ff02说“更新的2个文件”,但是当我查看日志时,它仍然在原地。UPD:也就是说,它确实将文件重置为修订版。git reset --hard虽然这只是行为的一半。
Hi-Angel

11

Hg手册的GitConcepts页面介绍了如何执行git用户在Mercurial中熟悉的许多操作。

Mercurial没有任何内置git reset --hard行为。但是,strip扩展名提供了一个strip命令。要使用,请首先strip~/.hgrc文件中启用::

[extensions]
strip =

注意:此扩展是Mercurial 2.8中的新增功能。以前的版本stripmq扩展名中提供了该命令。

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

$ hg strip tip

例如,使用revsets语法,我表示我想删除我的所有提交,这会导致在运行时显示额外的标题hg heads。如果您在下面的表达式中指定了除以外的特定修订版本,则tip当前分支中所有非您选择的修订版本的祖先都将被修剪。这似乎与我发出命令时想要的行为最接近git reset --hard HEAD

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

2
Mercurial 2.8及更高版本进行了strip扩展,以防万一只需要hg strip明确的命令。using也mq添加了各种其他补丁程序管理命令。
davidjb 2014年

在TortoiseHg 4.7及更高版本中,可以使用“文件”>“设置”>“扩展名”启用此功能,然后选中功能区,然后重新启动TortoiseHg。然后查看> ShowConsole,以获取命令行,例如键入hg strip --keep -r 50
Assad Ebrahim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.