Mercurial撤销上次提交

我怎样才能撤销我最后一次在Mercurial中意外提交(未推送)的更改?

如果可能的话,最好用TortoiseHg来做到这一点。

更新

在我的具体情况下,我犯了一个变更集(不推)。 然后我从服务器上拉出并更新。 有了这些新的更新,我决定,我最后一次提交已经过时,我不想同步它。 所以看起来, hg rollback不是我正在寻找的,因为它会回滚拉而不是我的提交。

一种方法是 hg rollback (从2013年8月的Hg2.7起弃用)

请使用hg commit --amend而不是rollback来纠正上次提交中的错误。

回滚存储库中的最后一个事务。

提交或合并时 ,Mercurial最后添加变更集条目。
Mercurial保存事务日志中的每个文件的名称和它的长度在事务之前。 在中止时,它会将每个文件截断为前一个长度。 这种简单性是使revlogs仅附加的一个好处。 事务日志还允许撤消操作。

请参阅TortoiseHg恢复部分 :

替代文字

这个线程还详细介绍了hg rollbackhg strip的区别:
(由马丁·盖斯勒 ( Martin Geisler )撰写,他也在SO上贡献)

  • ' hg rollback '将删除最后一个事务。 事务是数据库中经常遇到的一个概念。 在Mercurial中,当某些操作运行时,我们开始一个事务,比如commit,push,pull …
    当操作成功完成时,交易被标记为完成。 如果发生错误,事务将被“回滚”,并且存储库将保持与之前相同的状态。
    你可以用'hg rollback'手动触发回滚。 这将撤销上一个事务性命令。 如果一个pull命令将10个新的变更集带到不同分支的仓库中,那么' hg rollback '会将它们全部删除。 请注意:回滚事务时没有备份

  • ' hg strip '将删除一个变更集及其后代。 变更集被保存为一个包,如果需要的话可以再次申请。

ForeverWintr在评论(2016年,5年后)

您可以通过首先忘记它们来“解除”文件,例如: hg forget filea; hg commit --amend hg forget filea; hg commit --amend ,但这看起来不直观。
hg strip --keep可能是现代hg更好的解决scheme。

hg strip会从版本库中完全删除一个版本(和任何后代)。

要使用strip,需要通过将以下行添加到.hgrc(或mercurial.ini)来安装MqExtension :

 [extensions] mq = 

在TortoiseHg中,strip命令在工作台中可用。 右键单击一个修订版,然后select“修改历史” – >“剥离”。

由于strip更改存储库的历史logging,所以只能在尚未与任何人共享的修订版上使用它。 如果您使用的是mercurial 2.1+,则可以使用阶段来跟踪这些信息。 如果提交还处于草稿阶段,则不会与其他存储库共享,因此您可以安全地将其删除。 (感谢Zasurus指出了这一点)。

既然你不能回滚你应该把这个提交合并到你拉的时候得到的新头上。 如果你不想要你做的任何工作,你可以很容易的使用这个技巧 。

所以,如果你已经拉到头顶,你可以这样做:

 hg --config ui.merge=internal:local merge 

保留当前检出版本的所有更改,而没有检出的版本(你不再需要的版本)中没有任何更改。

这是一个很好的方法,因为它保持了你的历史的准确和完整。 如果从现在开始2年后,有人发现了一个错误,你可以看看你的(未使用但是保存的)同样的东西,然后去“哦,我做对了”。 🙂

hg rollback是你想要的。

在TortoiseHg中, hg rollback在提交对话框中完成。 打开提交对话框并select“撤消”。

替代文字

当你拉动并更新你的工作空间后,做一个修改,然后右键单击你想要删除的修改集,然后点击修改历史 – > strip,它将删除修改集,并且你会指向默认的提示。

它的解决方法。

如果你不推送到服务器,你将克隆到新的文件夹,否则从存储库文件夹中删除(删除所有文件)并克隆新的。