Mercurial撤消上次提交

时间:2011-01-21 15:42:46

标签: mercurial tortoisehg mercurial-commit

如何在Mercurial中撤消我上次意外提交(未推送)的更改?

如果可能的话,首选使用TortoiseHg的方法。

更新

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

9 个答案:

答案 0 :(得分:72)

一种方法是 hg rollback (自2013年8月起,Hg2.7已弃用)

  

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

     

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

     

committingmerging时,Mercurial会在最后添加changeset条目。
  Mercurial在交易之前保留所触及的每个文件的名称及其长度的事务日志。在中止时,它会将每个文件截断为其先前的长度。这种简单性是使revlogs仅附加的一个好处。事务日志还允许撤消操作。

请参阅TortoiseHg Recovery section

alt text

This thread还详细说明了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 strip --keep可能是更好的解决方案。

答案 1 :(得分:44)

hg strip将从存储库中完全删除修订版(以及任何后代)。

要使用条带,您需要通过在.hgrc(或mercurial.ini)中添加以下行来安装MqExtension

[extensions]
mq =

在TortoiseHg中,strip命令在工作台中可用。右键单击修订并选择“修改历史记录” - > '地带'。

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

答案 2 :(得分:19)

由于你无法回滚,你应该将该提交合并到你拉动时的新头部。如果您不想要在其中完成任何工作,可以使用this tip轻松完成。

因此,如果您已经拉出并更新到他们的头脑,您可以这样做:

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

保留当前已检出的修订版中的所有更改,并且未检出的修订版(您编写的不再需要的修订版)中没有任何更改。

这是一个很好的方法,因为它可以保持您的历史准确和完整。如果从现在起2年后有人发现你所拉下来的一个错误,你可以查看同一件事的(未使用但已保存)实现并去“哦,我做对了”。 :)

答案 3 :(得分:5)

hg rollback就是你想要的。

在TortoiseHg中,hg rollback在提交对话框中完成。打开提交对话框,然后选择“撤消”。

alt text

答案 4 :(得分:2)

在当前版本的TortoiseHg Workbench 4.4.1(07.2018)中,您可以使用Repository-Rollback/undo...
enter image description here

答案 5 :(得分:0)

拉完并更新工作区后,执行操作并右键单击要删除的更改集,然后单击修改历史记录 - > strip,它将删除更改集,您将指向默认提示。

答案 6 :(得分:0)

它的解决方法。

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

答案 7 :(得分:0)

我相信现在更现代,更简单的方法是hg uncommit。请注意,这留下了一个空的提交,如果您以后要重用提交消息,这将很有用。如果不这样做,请使用hg uncommit --no-keep不保留空提交。

hg取消提交[OPTION] ... [FILE] ...

取消提交部分或全部本地变更集

This command undoes the effect of a local commit, returning the affected
files to their uncommitted state. This means that files modified or
deleted in the changeset will be left unchanged, and so will remain
modified in the working directory.

If no files are specified, the commit will be left empty, unless --no-keep

抱歉,我不确定TortoiseHg等于什么。

答案 8 :(得分:0)

我最近遇到了这个问题,尽管我的情况略有不同 - 我已经推送了我想要撤消的提交。我用 hg backout <revision-code> 解决了我的问题。它的工作方式似乎与 git revert 类似。来自this answer

<块引用>

backout:创建一个与给定提交相反的新提交。 净效应是撤消,但更改会保留在您的历史记录中。

在 TortiseHg 中,可以通过右键单击要撤消的提交并选择 Backout... 来完成此操作。 TortiseHg 文档 here

Hg Backout example image

我认为创建一个新的撤消提交而不是完全删除以前的提交是有争议的。来自 this article 关于 git revert

<块引用>

它没有从项目历史记录中删除提交,而是计算 找出如何反转提交引入的更改并附加一个 带有生成的反向内容的新提交。这可以防止 Git 丢失历史记录,这对您修订的完整性很重要 历史和可靠的协作。