【问题标题】:How not to push a given commit如何不推送给定的提交
【发布时间】:2012-11-13 16:00:53
【问题描述】:

我不小心提交了一些大文件 (300MB)。然后我做了其他提交,意识到大文件不应该进入存储库,所以我删除了它们。

但是,在推送时,mercurial 会尝试按时间顺序发送变更集,这意味着它首先会尝试推送大文件。等待2小时后没有成功。那么,我可以在不影响其余部分的情况下摆脱那个特定的提交(变更集)吗?

或者我应该删除整个项目,提取一个新副本并手动重新应用我的其他更改?

【问题讨论】:

    标签: mercurial


    【解决方案1】:

    我通常发现rebasestrip命令对于这种历史修改操作是非常有用的工具;您可以将错误提交后所做的所有更改重新设置在其父级之上,然后剥离错误的变更集。

    假设<bad> 是您要删除的错误变更集,<parent> 是其父项,<child> 是您要保留的子项:

    hg rebase -s <child> -d <parent>
    hg strip <bad>
    

    例子:

    $ hg log -G
    @  changeset:   2:6d0685591967
    |  summary:     after
    |
    o  changeset:   1:fab6b3f4effa
    |  summary:     bad
    |
    o  changeset:   0:0233d1f3547c
       summary:     before
    
    $ hg rebase -s 2 -d 0
    saved backup bundle to .hg/strip-backup/6d0685591967-backup.hg
    $ hg log -G
    @  changeset:   2:b0fa9ee8533f
    |  parent:      0:0233d1f3547c
    |  summary:     after
    |
    | o  changeset:   1:fab6b3f4effa
    |/   summary:     bad
    |
    o  changeset:   0:0233d1f3547c
       summary:     before
    
    $ hg strip 1
    saved backup bundle to .hg/strip-backup/fab6b3f4effa-backup.hg
    $ hg log -G
    @  changeset:   1:b0fa9ee8533f
    |  summary:     after
    |
    o  changeset:   0:0233d1f3547c
       summary:     before
    

    如您所见,错误的变更集现已消失。

    请注意,要使rebasestrip 正常工作,您需要启用rebasemq 扩展。在执行此历史修改操作之前,请务必备份您的存储库。

    【讨论】:

      【解决方案2】:

      您不必完全手动重新应用其他更改。您可以export 他们然后import 他们到您的新存储库副本。

      【讨论】:

        【解决方案3】:

        只要推送没有完成,你可以尝试启用“mq”扩展,你可以删除一个没有被推送的提交。

        【讨论】:

        • 试过了,但它搞砸了整个本地存储库。我很生气,手动复制了更改的文件,删除了项目,提取了一个新副本并手动应用..
        • 是的,并不总是有效,具体取决于您的存储库的外观以及您与该提交相关的内容。
        猜你喜欢
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 2011-03-14
        • 2020-12-18
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        • 2020-01-04
        相关资源
        最近更新 更多