代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

如何用mercurial命令行合并以摆脱头部,就像我可以用tortoisehg一样?

  •  34
  • Lasse V. Karlsen  · 技术社区  · 15 年前

    我的问题是:

    • 如果我的mercurial存储库中有两个头(带有更改的分支),我希望去掉其中一个头,但放弃该分支中的所有更改,而不是将它们合并到另一个分支中,而且我无法删除这些更改集,因此必须合并,那么如何使用命令行cli来完成此操作?耳鼻喉?

    如果我的Mercurial存储库中有两个头部,并使用TortoiseHg作为客户机,那么存储库可能如下所示:

    two heads

    那我就可以摆脱 test2 做一个合并和丢弃。首先我会更新到我想保留的头部( test3 在这种情况下,上面的图像中已经是我的工作文件夹的当前父文件夹)。然后右键单击并选择“合并为…”:

    merge with...

    在弹出的对话框中,我将选择放弃来自合并目标的更改(即,我要放弃来自的所有更改的分支):

    merge dialog

    在合并完成后,所有 测试2 头被丢弃了,我可以承诺。头现在已经不见了,但变化仍然是历史的一部分。

    我的问题是:如何只使用命令行客户机来做同样的事情?我找不到任何与 hg merge 命令:

    hg merge [-P] [-f] [[-r] REV]
    
    merge working directory with another revision
    
    ... snipped text
    
    options:
    
     -f --force       force a merge with outstanding changes
     -t --tool VALUE  specify merge tool
     -r --rev REV     revision to merge
     -P --preview     review revisions to merge (no merge is performed)
        --mq          operate on patch repository
    
    use "hg -v help merge" to show global options
    

    编辑 :debugsetparents工作得很好:

    hg debugsetparents . 1
    hg commit -m "merged to get rid of changeset #1"
    

    编辑 :尝试使用 --tool internal:local 根据其中一个答案:

    @echo off
    
    setlocal
    if exist repo rd /s /q repo
    hg init repo
    cd repo
    
    rem revision 0
    echo >test1.txt
    hg commit -m "test1" --addremove
    
    rem revision 1
    echo >test2.txt
    hg commit -m "test2" --addremove
    
    rem revision 2
    hg update 0
    echo >test3.txt
    hg commit -m "test3" --addremove
    
    rem now let's get rid of change in revision 1 with merge
    hg merge --tool internal:local -r 1
    hg commit -m "merged"
    
    dir
    

    执行输出:

    [C:\Temp] :test
    adding test1.txt
    adding test2.txt
    0 files updated, 0 files merged, 1 files removed, 0 files unresolved
    adding test3.txt
    created new head
    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
    (branch merge, don't forget to commit)
    
     Volume in drive C is unlabeled      Serial number is 0e17:6aba
     Directory of  C:\Temp\repo\*
    
    16.11.2010  20:05             .
    16.11.2010  20:05             ..
    16.11.2010  20:05             .hg
    16.11.2010  20:05              13  test1.txt
    16.11.2010  20:05              13  test2.txt
    16.11.2010  20:05              13  test3.txt
                    39 bytes in 3 files and 3 dirs    12 288 bytes allocated
        66 600 316 928 bytes free
    

    在这里,第二个变更集中引入的变更(修订号为1的变更)现在出现在合并的变更集中。这不是我想要的。

    2 回复  |  直到 15 年前
        1
  •  31
  •   Joshua Goldberg    9 年前

    根据TortoiseHg的 source ,当您检查时 Discard all changes from merge target (other) revision ,它使用 hg debugsetparents 命令:

    hg debugsetparents REV1 [REV2]
    
    manually set the parents of the current working directory
    
        This is useful for writing repository conversion tools, but should be used with care.
    
        Returns 0 on success.
    
    use "hg -v help debugsetparents" to show global options
    

    使用方法:

        hg up <revision-to-keep>
        hg debugsetparents <revision-to-keep> <revision-to-throw-away>
        hg commit -m "Merge to discard ..."
    
        2
  •  3
  •   Kevin    11 年前

    如果你不想使用 debugsetparents ,您可以手动还原到要在提交前保留的变更集:

    hg merge --tool internal:local -r HEAD_YOU_WANT_TO_DISCARD
    hg revert -r 'tip^'
    hg commit
    

    然而,请注意,这种技术不一定是最佳方法。你最好闭上头:

    hg up HEAD_YOU_WANT_TO_DISCARD
    hg commit --close-branch
    

    这里的文档有点误导性;这只会关闭特定的头部,而不是整个分支。