首页 文章

有没有办法删除Mercurial中的本地提交?

提问于
浏览
196

所以我在Mercurial中犯了一个愚蠢的错误 . 很多时候,我会在没有做“hg pull”和“hg update”的情况下开始工作 . 当我尝试推送我的更改时,出现错误 .

有没有办法删除我的本地提交,所以我可以避免创建多个头,分支等?我只想删除我的本地提交,将我的更改与提示合并,然后重新提交 . 听起来很简单吧?我似乎无法找到任何方法轻松删除本地提交,所以我可以干净地合并提示 .

我再次尝试删除使用“hg ci”进行的本地提交 . 我不想修改文件,还原等 .

8 回答

  • 9

    启用“ strip ”扩展名并键入以下内容:

    hg strip #changeset# --keep
    

    #changeset# 是您要删除的变更集的哈希值 . 这将删除从它下降的所述变更集 including 变更集 and will leave your working directory untouched . 如果您还希望还原已提交的代码更改,请删除 --keep 选项 .

    有关更多信息,请查看Strip Extension .

    如果你得到"unkown command 'strip'",你可能需要启用它 . 为此,请找到 .hgrcMercurial.ini 文件并将以下内容添加到其中:

    [extensions]
    strip =
    

    注意(正如Juozas在他的评论中提到的)具有多个头部是Mercurial中的正常工作流程 . 你不应该使用strip命令来对抗它 . 相反,您应该将头部与传入头部合并,解决任何冲突,测试,然后推送 .

    当你真的想要摆脱污染分支的变更集时, strip 命令很有用 . 事实上,如果您处于this question的情况并且想要永久删除所有"draft"更改集,请查看the top answer,这基本上建议:

    hg strip 'roots(outgoing())'
    
  • 5

    如果您正在使用Hg Tortoise,请激活扩展名“ strip ”:

    文件/设置/扩展/选择条带

    然后选择要开始条带化的底部修订,方法是在其上执行 right click ,然后选择:

    修改历史记录条带

    像这样:

    enter image description here

    在这个例子中,它将从第19个修订版删除到最后一个修订版(22) .

  • 9

    现代答案(仅在Mercurial 2.1之后有关):

    使用Phases并标记您要发送的修订版本 .

    在TortoiseHG中,您可以右键单击提交以更改其阶段 .

    Also: 拉动后,您还可以使用扩展名"rebase"将本地提交移动到共享存储库的头部 .

  • 4

    正如其他人都指出你应该只是拉动然后合并头部,但是如果你真的想要在没有任何EditingHistory工具的情况下摆脱你的提交,那么你可以只是 hg clone -r 你的回购获得除了那些改变以外的所有 .

    这不会将它们从原始存储库中删除,但会创建一个没有它们的新克隆 . 然后你可以删除你修改过的仓库(如果你愿意的话) .

  • 92

    我也遇到过这个问题 . 我做了2 commit 并想要回滚并删除这两个提交 .

    $ hg rollback
    

    hg rollback 只是回滚到最后一次提交,而不是2次提交 . 那时我没有意识到这一点,我改变了代码 .

    当我发现 hg rollback 刚刚回滚一次提交时,我发现我可以使用 hg strip #changeset# . 所以,我使用 hg log -l 10 来查找最新的10次提交并获得我想要的正确的变更集 strip .

    $ hg log -l 10
    changeset:   2499:81a7a8f7a5cd
    branch:      component_engine
    tag:         tip
    user:        myname<myname@email.com>
    date:        Fri Aug 14 12:22:02 2015 +0800
    summary:     get runs from sandbox
    
    changeset:   2498:9e3e1de76127
    branch:      component_engine
    user:        other_user_name<name@email.com>
    date:        Mon Aug 03 09:50:18 2015 +0800
    summary:     Set current destination to a copy incoming exchange
    
    ......
    
    $ hg strip 2499
    abort: local changes found
    

    abort: local changes found 是什么意思?这意味着 hg 发现了尚未提交的代码的更改 . 因此,要解决此问题,您应该 hg diff 来保存您已更改的代码 hg reverthg strip #changeset# . 像这样:

    $ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
    $ hg revert file_you_have_changed
    $ hg strip #changeset#
    

    完成上述操作后,您可以使用差异文件,并将代码添加回项目中 .

    $ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
    
  • 14

    您可以使用Rebase extension更轻松地解决这个问题,只需使用 hg pull --rebase ,您的提交会自动重新调整到撤销的版本,从而避免出现分支问题 .

  • 19

    如果你熟悉git,你会很乐意使用histedit,就像 git rebase -i 一样 .

  • 226

    hg strip 正是您要找的 . 如果您熟悉git,它类似于 git reset .

    使用控制台:

    • 您需要知道修订号 . hg log -l 10 . 此命令显示最近10次提交 . 找到您正在寻找的提交 . 变更线 changeset: 5888:ba6205914681 需要4位数字

    • 然后 hg strip -r 5888 --keep . 这将删除提交记录但保留所有文件,然后您可以重新发送它们 . (如果要删除文件只需删除--keep hg strip -r 5888

相关问题