【问题标题】:"bzr uncommit" equivalent in Mercurial?Mercurial中的“bzr uncommit”等价物?
【发布时间】:2010-10-29 11:07:36
【问题描述】:

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.

【问题讨论】:

    标签: version-control mercurial dvcs bazaar


    【解决方案1】:

    “hg revert”不这样做吗?

    【讨论】:

    • 它会还原文件,但我希望从历史记录中删除整个提交(消息和所有)。
    • 或者hg help revert 没有给我看的东西……?
    • "hg revert" 不会改变历史。相反,“hg revert”会更改工作副本——您使用它将未提交的更改恢复到某个较早的修订版(通常是工作副本的父修订版)。要重做一个提交,你不能使用“hg revert”,我建议改为“hg rollback”。
    【解决方案2】:

    也许是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 可能是更好的方法!

    【讨论】:

    • 关闭,但不完全。 bzr revert 将保留所有文件,准备好重新提交。
    • 无论如何,"hg rollback" 似乎越来越像你想要的——不过,根据红豆书,它会回滚最新的 事务(提交或拉取)再说一遍,“你只能回滚一次”和“推了就没用了”。
    • 啊,是的——当我想回到这里看看是否还有更多的 cmets 时,我正在阅读有关回滚的信息。回滚是我想要的几乎...但是它并没有为我放回文件(即,需要还原才能将文件放回提交前的位置)...但是我想我不会再抱怨了 :) 感谢 Alex 的帮助!
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 感谢您的评论,但我认为 hg rollback 是我要找的。​​span>
    • 从 hg 回滚命令行帮助中,“它还将恢复上次事务时的 dirstate。”这不是您要避免的吗?
    • @Marc:不,他也想找回 dirstate。例如,这就是跟踪添加的文件的原因。所以“hg add foo.c; hg commit; hg rollback” 将按照“hg status”添加 foo.c。
    • 顺便说一句,我同意谈论“dirstate”是一种糟糕的风格,因为用户不必知道这个术语。
    【解决方案4】:

    您需要hg rollback 命令,但如果您使用的是 Mercurial 2.2 或更高版本,请参见下文。

    回滚命令将从您的存储库中删除最后一个事务。提交是一个事务,因此您可以将其用作

    % 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 commit 确实是对工作副本进行操作的最后一个命令,则应该只使用 hg rollback 撤消提交。

    另外,如果你没有在命令行上给出提交信息,那么你不能在回滚后只按两次向上箭头来重做提交。但是,Mercurial 1.5 及更高版本会将您的最后一条提交消息保存在 .hg/last-message.txt 中,以便您在回滚后始终可以再次找到它。

    Mercurial 2.2 有一个新的 --amend 标志 用于hg commit。这让您可以使用新的更改来修改最后一次提交。它只是将hg status 列出的更改合并到父提交中,就好像您已经回滚并再次提交一样。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 抱歉,这是不正确的——hg strip 将从存储库中删除变更集,而bzr uncommit 会将存储库和工作树设置回它们在提交之前的状态。
      • 嗯,这正是我使用“几乎”这个词的原因——唯一的区别似乎是工作目录的状态。我只是认为值得一提,因为这是“bzr uncommit”唯一的 Mercurial 等效项(遗憾的是,这是一个不明显的,因此很难找到),能够在提交后不立即删除多个变更集。根据 Bazaar 文档, bzr uncommit 可以做到这一点。如果您知道另一个能够删除多个变更集的篡改历史的 Mercurial 命令(例如“bzr uncommit -r 1”),请告诉我。我很乐意了解它。
      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多