最后一次提交

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

如果可能的话,最好用龟汞来做这件事。

更新

在我的具体案例中,我提交了一个变更集(不是推送的)。然后我从服务器上下载并更新了。有了这些新的更新,我决定,我的最后一次提交已经过时,我不想同步它。因此,看起来 hg rollback并不完全是我要寻找的,因为它将回滚拉取而不是我的提交。

143027 次浏览

一种方法是 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳(在2013年8月 Hg2.7时已弃用)

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

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

承诺融合时,Mercurial 最后添加 变更集条目。
Mercurial 保存一个事务日志,记录事务之前所接触的每个文件的名称及其长度。在中止时,它将每个文件截断到其先前的长度。这种简单性是使 Revlog仅附加的好处之一。事务日志还允许撤消操作。

龟汞回收部:

alt text

这个线程 还详细说明了 hg rollbackhg 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 可能是一个更好的解决方案。

hg rollback 就是你想要的。

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

alt text

既然你不能回滚,你应该合并到新的头你得到的提交时,你拉。如果你不想做任何工作,你可以很容易地做到这一点使用 这个小费

因此,如果你拉动 更新到他们的大脑,你可以这样做:

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

保留当前签出版本中的所有更改,而不保留未签出版本中的所有更改(您编写的不再需要的版本)。

这是一个伟大的方式做到这一点,因为它保持你的历史准确和完整。如果两年后有人发现你删除的东西有漏洞,你可以查看你的(未使用但保存的)同样东西的实现,然后说,“哦,我做对了”。:)

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

要使用 Strip,你需要通过在. hgrc (或 mercurial.ini)中添加以下代码行来安装 Mq 扩展:

[extensions]
mq =

在 TortoiseHg 中,在工作台中可以使用 Strip 命令。右键单击修订,选择“修改历史记录”-> “删除”。

由于 strip改变了存储库的历史,因此您应该只在尚未与任何人共享的修订版本中使用它。如果您正在使用 mercurial 2.1 + ,您可以使用 阶段来跟踪这些信息。如果提交仍然处于草案阶段,那么它还没有与其他存储库共享,因此您可以安全地删除它。(感谢 Zasurus 指出这一点)。

在你拉和更新你的工作区后,做一个 thg,右键点击你想要去掉的变更集,然后点击修改历史-> 带,它会删除变更集,你会指向默认提示。

它的变通方法。

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

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

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

... [文件] ..。

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

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

对不起,我不知道什么是等价的龟汞。

我最近遇到了这个问题,尽管我的情况略有不同——我已经推出了我想撤销的承诺。我解决了 hg backout <revision-code>的问题。它的工作方式似乎与 git revert类似。来自 这个答案:

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

在 TortiseHg 中,这可以通过右键单击要撤消的提交并选择 Backout...来完成。扭曲的文件 给你

Hg Backout example image

我认为应该创建一个新的撤消提交,而不是完全删除以前的提交。从 这篇文章git revert:

它没有从项目历史记录中删除提交,而是显示了 输出如何反转提交引入的更改,并附加 使用结果反向内容进行新的提交。这可以防止 Git 丢失历史记录,这对修订的完整性很重要 历史和可靠的合作。