12

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.
4

5 回答 5

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 --amend2.2hg commit. 这让您可以使用新的更改来修改最后一次提交。它只是将 列出的更改hg status合并到父提交中,就好像您已回滚并再次提交一样。

于 2009-05-28T17:08:36.017 回答
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可能是一个更好的方法!

于 2009-05-28T01:53:56.407 回答
0

“hg revert”不这样做吗?

于 2009-05-28T01:47:44.127 回答
0

通过阅读评论,您似乎想要一种方法来简单地取消提交记录而不撤消对文件的更改。在 Mercurial 中,没有自动执行此操作的方法。hg revert与您将要获得的一样接近。

但是,您可以通过几个手动步骤来做到这一点。当您调用 时hg revert,它的默认行为是获取您正在恢复的变更集中的文件并将它们重命名为filename.ext.orig,其中ext是文件的原始扩展名。然后恢复的版本采用原始文件名。所以你可以做的是运行hg revert,删除具有原始名称的文件,并.orig从备份文件的名称中删除。然后使用更正后的日志消息重新提交。只是不要对除提示之外的任何修订执行此操作,因为您可能会得到很多已更改的文件而忘记哪些文件属于哪个变更集。

如果您已经将变更集推送到远程仓库,我也不建议您这样做。仅当一切仍然只是本地时才这样做。

如果您需要进一步解释,请告诉我。我有时不得不这样做,所以我熟悉这个过程。

于 2009-05-28T02:01:29.917 回答
0

还有来自“mq”扩展的“hg strip”命令。它几乎完全等同于“bzr uncommit”。但请注意,当您之前将错误提交推送到另一个存储库时,它将通过最近的拉取重新创建。

于 2010-05-31T13:17:32.483 回答