水星撤消最后一次提交


125

我如何撤消我最近一次意外提交(未推送)的Mercurial更改?

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

更新资料

在我的具体情况下,我提交了一个变更集(未推送)。然后,我从服务器中拉出并进行了更新。通过这些新更新,我决定我的上次提交已过时,并且我不想同步它。看来,这hg rollback并不是我要搜索的,因为它会回滚拉动而不是我的提交。


1
做成两个hg rollback然后再拉呢?
VonC

1
第一次回滚确实撤消了拉动,第二次回滚告诉我“没有可用的回滚信息”。
Martin Buberl 2011年

1
我也遇到过同样的情况,据我所知,一旦执行了其他任何操作,就无法返回或将其从历史记录中删除。您将需要重新克隆hg存储库。

3
strip --keepstackoverflow.com/questions/29413851/…和MQ qimport一样直接解决了任务。替代地,rebase如果也要保留本地更改并且不存在冲突,则对于场景而言可能会更好。(当合并是期望的图形最终目标时,尤其是在非快进情况下,请使用合并来保留两个分支的某些组合更改。)仅关闭分支仍可以“保留历史记录”,这可能也是有效的(但与合并不同),具体取决于所需的最终状态。
user2864740 '16

2
正如@ user2864740所说,hg strip --keep该命令确实可以使用,但是您需要提供一个修订,例如:hg strip --keep -r .。这个答案很好地解释了stackoverflow.com/a/19064016/1286571
ForeverWintr'1

Answers:


77

一种方法是 hg rollback (自2013年8月Hg2.7起不推荐使用)

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

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

提交合并,水银增加了变更的最后一项。
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在评论中建议(5年后的2016年)

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


据我所知,正确的回滚将删除最后一个事务。就我而言,我做了一个提交,然后我从服务器上撤了下来。因此,这是否意味着我将回滚拉取而不是提交?
Martin Buberl 2011年

1
@Martin Buberl:根据selenic.com/mercurial/hg.1.html#rollback,拉动被视为一项交易。因此,如果您拉出,执行hg rollback将撤消拉取而不是提交。
Tim Henigan 2011年

2
我不确定hg commit --amend应该如何工作,但是对我来说,它给了我一个编辑器来修改提交消息,而没有办法更改包含的文件。我没有保存就退出了编辑器,发现我的错误提交已更改为包括所有更改的文件!
蒂姆·迪斯达尔

2
我不清楚如何使用来完成对问题的解答hg commit --amend。您可以先对文件进行“取消提交”操作hg forget,例如:hg forget filea; hg commit --amend,但这似乎并不直观。汞带--keep可能是现代汞更好的解决方案。
ForeverWintr '16

1
@JasonSbook.mercurial-scm.org/ read/…是一本不错的书,尽管就您而言,您还可以考虑进行hg重置:stackoverflow.com/a/31302998/6309
VonC

46

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

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

[extensions]
mq =

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

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


2
如果有问题的修订版仍在草稿短语中(或者您可以访问已推入/拉入的所有回购清单,并将其应用到所有回购清单中)(本说明中就是这种情况),则为最好和最干净的选择。
GazB 2012年

4
如果您安装了TortoiseHg,则有一个用于全局激活mq的图形界面。在当前版本中:启用“文件->设置->全局设置选项卡->扩展名-> mq”或通过“编辑文件”按钮访问设置文件。
大卫,

19

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

因此,如果您已经拉动并更新了他们的头,则可以执行以下操作:

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

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

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


5

hg rollback 是你想要的。

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

替代文字


1
我做了一个提交,然后拉和更新/同步。通过这些新更改,我确定我的上次提交已过时,希望撤消它。在我的情况下,TortoiseHg中的“撤消”按钮被禁用。
Martin Buberl 2011年

现在不建议使用回滚。
UpTheCreek 2014年

在当前版本的Tortoise HG中,您可以从“存储库”菜单项进入“回滚/撤消”选项。
daveywc 2015年

需要@UpTheCreek引用。
DanMan '16

@DanMan-检查他提供的链接。
UpTheCreek '16

3

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


1

解决方法。

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.