【问题标题】:Hg: delete latest commits [duplicate]Hg:删除最新提交[重复]
【发布时间】:2012-01-01 23:31:33
【问题描述】:

我过去使用过 Git,我是 Hg 菜鸟:

我有以下存储库结构:

o [> default] commit A
|
o commit B
.
.
.
o <a-tag]
|

我已经使用a-tag 更新了提交并提交了一些其他提交。现在我有

o [> default] commit C
|
o commit D
|
|  o [default] commit A
|  |
|  o commit B
|  .
|  .
|  .
| /
o <a-tag]
|

现在(在推送之前)我意识到我的提交 commit Ccommit D 基于错误的提交。我怎样才能回到初始状态(无需重新克隆存储库)删除这些提交 commit Ccommit D(附加到 git reset --hard a-tag)?

【问题讨论】:

    标签: mercurial undo


    【解决方案1】:

    您可以使用“strip”永久删除提交及其所有后代。在您的情况下,您需要指定“D”版本的 id:

    hg strip -r D
    

    注意:mq 扩展必须开启:

    [extensions]
    mq=
    

    Mercurial 在 .hg/strip-backup 中备份已剥离变更集的捆绑包,因此此操作相当安全。

    【讨论】:

      【解决方案2】:

      你说没有克隆,我会谈到这个,但首先让我指出这样做:

      cd ..
      hg clone -r -2 yourrepo yournewrepo
      

      是一种即时操作,可以在本地为您提供新的克隆,而无需在旧存储库中进行最后两次提交。因为它是一个本地克隆,所以它使用硬链接(即使在 Windows 上),因此存储库不会占用额外的磁盘空间。

      这是经典的 Mercurial 解决方案。 Mercurial 是根据不可变历史的理念构建的。如果历史中有什么你后悔犯了它的逆向(这就是backout 所做的),那么历史就会显示错误及其更正——就像科学家的日志簿一样。如果你不能/不能忍受它在历史上的存在,你会像我上面展示的那样做一个将它排除在外的克隆。

      并不是每个人都可以如此……铁杆……关于他们的历史,因此出现了许多会修改历史的扩展,但必须专门启用它们。在您的情况下,您已经安装的 rebase 扩展(它现在随 Mercurial 一起提供)将完全满足您的需求。您只需要在您的~/.hgrc 中启用它,然后将 D 重新设置为 A。如果您真的只想让 C 离开 mq 扩展中的 strip 命令,就可以做到这一点。它还随 Mercurial 一起提供。

      【讨论】:

        【解决方案3】:

        我会从适当的点克隆并删除旧的存储库。 如果不进行克隆,请考虑 hg backout 先撤消 C 再撤消 D,或者,如果这是您的最终目标 hg rebase 将 C 和 D 移动到 commit A 点。

        【讨论】:

          【解决方案4】:

          BackoutC + backout D 将删除这 2 个提交,但添加额外的 3 个(backout+backout+merge)。从历史记录中“清除”删除可能是

          如果您只想更改错误的父项以更正,则必须使用 rebase,正如@chill 提到的那样

          【讨论】:

            猜你喜欢
            • 2014-10-14
            • 2012-12-12
            • 2012-06-04
            • 2023-03-27
            • 2011-11-01
            • 2021-06-19
            • 2021-08-18
            • 2013-03-28
            • 2013-08-11
            相关资源
            最近更新 更多