Bazaar有一个很棒的uncommit
命令,它简单地撤消了最后一次提交。 Mercurial中有没有相应的东西?
编辑:Bazaar的uncommit命令不会修改文件 - 它会删除最后一次提交和关联数据(例如,当您注意到提交消息中存在拼写错误或者文件没有添加应该是。)
例如:
$ bzr ci -m "Fixed a proooblem" <-- problem is misspelt
$ bzr uncommit
...
$ bzr ci -m "Fixed a problem" <-- Exactly as if the first commit was correct.
答案 0 :(得分:23)
您需要hg rollback
命令,但如果您使用的是Mercurial 2.2或更高版本,请参阅下文。
rollback命令将从存储库中删除最后一个事务。提交是一个事务,因此您可以将其用作
% hg commit -m 'My elaburate bugfix.' foo.c foo.h
% hg rollback
% hg commit -m 'My elaborate bugfix.' foo.c foo.h
在回滚之后,文件将再次被视为已修改,这意味着第二次提交将存储与第一次相同的更改,但具有更好的提交消息。
注意: hg rollback
比简单的“不提交”功能更强大,如果您不小心,可以将其用于丢弃工作。扔掉提交
$ hg commit -m 'My big and very difficult bugfix'
$ hg pull --update
$ hg rollback
您现在已经丢失了上次提交的内容,并且由于您将工作副本更新为其他修订版,因此该提交中的更改已消失。因此,如果您确定hg rollback
确实是在工作副本上运行的最后一个命令,那么您应该只使用hg commit
撤消提交。
此外,如果您没有在命令行上提交提交消息,那么您不能只按向上箭头两次以在回滚后重做提交。但是,Mercurial 1.5及更高版本会在.hg/last-message.txt
中保存您的上次提交消息,以便您可以在回滚后再次找到它。
Mercurial 2.2为--amend
添加了一个新的 hg commit
标记。这让你用新的修改修改最后一次提交。它只是将hg status
列出的更改合并到父提交中,就像您已经回滚并再次提交一样。
答案 1 :(得分:8)
也许hg backout tip
?我建议http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html了解hg backout
的所有详细信息,它与hg revert
的区别,以及许多相关主题,但如果我找不到uncommit
的内容,那么它似乎完全相同于hg backout tip
。
编辑:在评论中你现在澄清了你想要“删除历史” - 这很难(除非你在抽奖中非常快,也许; - )...再次按照红豆书:
由于Mercurial将历史视为累积 - 每次变更都建立在之前的所有变更之上 - 您通常无法让灾难性的变化消失。一个例外是当您刚刚提交更改时,它尚未被推送或拉入另一个存储库。那时你可以安全地使用hg rollback命令
所以,如果你只是想尝试“让它消失”(你很幸运,它还没有推到或拉到其他地方),那么hg rollback
可能是一个更好的方法!
答案 2 :(得分:0)
不是“hg revert”那样做吗?
答案 3 :(得分:0)
通过阅读评论,您似乎想要一种方法来简单地取消提交记录而不撤消对文件的更改。在Mercurial中,没有自动化的方法。 hg revert
尽可能接近你。
但是,可以通过几个手动步骤来完成此操作。当您调用hg revert
时,其默认行为是获取要还原的变更集中的文件,并将其重命名为filename.ext.orig
,其中ext
是文件的原始扩展名。然后,恢复的版本采用原始文件名。因此,您可以执行的操作是hg revert
,删除具有原始名称的文件,并从备份文件的名称中删除.orig
。然后使用更正的日志消息重新提交。只是不要使用除提示之外的任何修订版本,因为您可能会获得大量已更改的文件,并忘记哪些文件属于哪个更改集。
如果您已将更改集推送到远程仓库,我也不建议这样做。只有当一切仍然只是本地时才这样做。
如果您需要进一步解释,请告诉我。我有时必须这样做,所以我对这个过程很熟悉。
答案 4 :(得分:0)
“mq”扩展名中还有“hg strip”命令。它几乎完全等同于“bzr uncommit”。但要注意,当您将错误提交提前推送到另一个存储库时,它将使用最近的提取重新创建。