129

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

如果可能,最好使用 TortoiseHg 的方法。

更新

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

4

9 回答 9

82

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

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

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

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

请参阅TortoiseHg 恢复部分

替代文字

该线程hg rollback还详细介绍了和之间的区别hg strip:(
Martin Geisler撰写,他也为 SO 做出了贡献)

  • ' hg rollback' 将删除最后一个事务。事务是数据库中经常出现的一个概念。在 Mercurial 中,我们在运行某些操作时启动事务,例如提交、推送、拉取……
    当操作成功完成时,事务被标记为完成。如果发生错误,事务将“回滚”并且存储库保持与以前相同的状态。
    您可以使用“hg rollback”手动触发回滚。这将撤消最后一个事务性命令。如果一个 pull 命令将 10 个新的变更集带入不同分支的存储库中,那么 ' hg rollback' 将把它们全部删除。请注意:回滚事务时没有备份

  • ' hg strip' 将删除变更集及其所有后代。变更集保存为一个包,如果您需要它们,您可以再次应用它们。

ForeverWintr在评论中建议(2016 年,5 年后)

您可以通过首先忘记文件来“取消提交”文件,例如:hg forget filea; hg commit --amend,但这似乎不直观。
hg strip --keep可能是现代汞的更好解决方案。

于 2011-01-21T15:50:11.537 回答
48

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

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

[extensions]
mq =

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

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

于 2011-06-07T04:42:37.743 回答
19

由于您无法回滚,因此您应该将该提交合并到您拉动时获得的新头中。如果您不想要您在其中所做的任何工作,您可以使用此技巧轻松完成。

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

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

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

这是一种很好的方法,因为它可以使您的历史记录保持准确和完整。如果 2 年后有人在您下拉的内容中发现错误,您可以查看(未使用但已保存)的相同内容实现,然后说“哦,我做对了”。:)

于 2011-01-21T16:50:20.813 回答
6

hg rollback是你想要的。

在 TortoiseHg 中,这hg rollback是在提交对话框中完成的。打开提交对话框并选择“撤消”。

替代文字

于 2011-01-21T16:00:57.343 回答
4

在当前版本的 TortoiseHg Workbench 4.4.1 (07.2018) 中,您可以使用Repository- Rollback/undo...
在此处输入图像描述

于 2018-07-25T12:56:00.327 回答
1

它的解决方法。

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

于 2016-09-24T07:28:11.553 回答
0

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

于 2011-08-08T16:06:28.687 回答
0

我最近遇到了这个问题,虽然我的情况略有不同——我已经推送了我想要撤消的提交。我解决了我的问题hg backout <revision-code>。它的工作方式似乎与git revert. 从这个答案

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

在 TortiseHg 中,这可以通过右键单击要撤消的提交并选择Backout.... TortiseHg 文档在这里

Hg Backout 示例图像

我认为有一个论点是创建一个新的撤消提交而不是彻底删除以前的提交。从这篇文章中关于git revert

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

于 2021-04-12T21:45:04.567 回答
0

我相信现在更现代、更简单的方法是hg uncommit. 请注意,这会留下一个空提交,如果您想稍后重用提交消息,这可能很有用。如果不这样做,请使用hg uncommit --no-keep不留下空提交。

hg 取消提交 [选项]... [文件]...

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

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 的等价物是什么。

于 2020-10-12T17:17:17.757 回答