Mercurial撤销上次提交
我怎样才能撤销我最后一次在Mercurial中意外提交(未推送)的更改?
如果可能的话,最好用TortoiseHg来做到这一点。
更新
在我的具体情况下,我犯了一个变更集(不推)。 然后我从服务器上拉出并更新。 有了这些新的更新,我决定,我最后一次提交已经过时,我不想同步它。 所以看起来, hg rollback
不是我正在寻找的,因为它会回滚拉而不是我的提交。
一种方法是 (从2013年8月的Hg2.7起弃用) hg rollback
请使用
hg commit --amend
而不是rollback
来纠正上次提交中的错误。回滚存储库中的最后一个事务。
提交或合并时 ,Mercurial最后添加变更集条目。
Mercurial保存事务日志中的每个文件的名称和它的长度在事务之前。 在中止时,它会将每个文件截断为前一个长度。 这种简单性是使revlogs仅附加的一个好处。 事务日志还允许撤消操作。
请参阅TortoiseHg恢复部分 :
这个线程还详细介绍了hg rollback
和hg 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,它将删除修改集,并且你会指向默认的提示。
它的解决方法。
如果你不推送到服务器,你将克隆到新的文件夹,否则从存储库文件夹中删除(删除所有文件)并克隆新的。