如何在Mercurial上“回滚”最后一次提交?

74

我有一个Mercurial仓库,仅在本地使用...这是我个人使用的(所以我不会在任何地方“push”)。

我提交了3个文件,但之后我明白应该提交4个文件...

是否有一种方法可以“回滚”我的最新(最近的,唯一的)提交,并使用正确的文件进行“重新提交”?

(我不知道为什么,但我的“修改当前修订版”选项没有激活,所以我不能使用它...)


1
可能是Mercurial撤销上一次提交的重复问题。 - ᄂ ᄀ
使用 hg strip --keep -r . 命令。https://dev59.com/i2cs5IYBdhLWcg3wHwbU#19064016 - ForeverWintr
可能是Mercurial(hg)等效于git reset(--mixed或--soft)的重复问题。 - ForeverWintr
对于那些后来到这里的人,重要的是注意“修改当前修订选项不可用”的说明。如果可以的话,“修改当前修订”是最好的选择。 - PhoneixS
3个回答

99

3
我通过界面找到了如何操作:仓库=>回滚\撤销 (Ctrl+U)。谢谢! - serhio
9
hg rollback已被弃用,应使用hg commit --amend。请参阅https://dev59.com/7W445IYBdhLWcg3wpL1_。 - ᄂ ᄀ
8
很遗憾,hg commit --amend 并不能完全替代 hg rollback。虽然它可以用于添加新的变更(或更改信息),但是如果想要不添加任何变更,请祈求好运。"[amend] 可以用于将工作目录的父项与包含由 hg 状态报告的当前变更 以及 额外变更的新提交进行修改,如果有的话。" TortoiseHG Workbench 做了一些魔法来允许“记录式”的块选择,这确实可以做到:但这并不是通过使用 hg commit --amend 作为通用的 hg revert 替代品来实现的。 - user2864740
2
$ hg commit --amend -i 结果显示 "hg commit: 未识别选项 -i"。 - kguest
13
如果您能展示如何使用“hg commit --amend”来替换此情况下的“hg rollback”,那么您的评论将更有用。 - ForeverWintr
显示剩余3条评论

40

答案是strip(如果您未启用它,可以在此处查看如何启用:https://dev59.com/J3E85IYBdhLWcg3wqVX5#18832892)。

如果您想还原最新的提交,请使用以下命令:

hg strip --keep -r .

如果你想回到某个特定的提交:

hg strip --keep -r 1234

使用strip命令将文件状态还原到指定的提交,但文件会成为待处理更改,因此可以与文件一起应用于新提交。

恢复被还原的数据:

如果您误用了该命令或者想要恢复更改,则可以在.hg/strip-backup文件夹中找到被还原的文件。

有关如何恢复文件的教程,请参见链接(在所有操作系统上都适用)或搜索相关信息。

感谢ForeverWintr


这对我非常有效。包括“--keep”可以将那些未完成的提交文件恢复到挂起状态,以便您可以丢弃/搁置或重新提交。谢谢。(顺便说一句,我使用了SourceTree) - Molik Miah
3
Strip 是一个默认未启用的扩展。请参考 https://dev59.com/J3E85IYBdhLWcg3wqVX5#18832892 了解如何启用它。 - Andrei
要在TortoiseHg 4.7或更高版本中启用strip扩展,请使用文件>设置>扩展,然后选中复选框strip,并重新启动TortoiseHg。使用视图>显示控制台来显示Hg命令行,以输入例如hg strip --keep -r 50。 - Assad Ebrahim
如果我从远程拉取更改,然后“strip”掉最后的变更集并将其“push”回去(或者创建一个新的提交并“push”),会发生什么?那会从远程历史记录中删除提交吗?这会破坏存储库吗? - Violet Giraffe

5
在现代的hg中:
使用命令 hg uncommit 来撤销提交。
对于你的具体问题,可以使用上述命令来解决。
hg add file4
hg amend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接