为什么hg update命令在某些情况下合并但不是全部?

Vai*_*pai 4 mercurial

案例1:更新工作目录

$ hg update [-r REV]
Run Code Online (Sandbox Code Playgroud)

这会将工作目录切换到指定的版本.但是,如果我的工作目录已修改更改,则会将更改合并回来REV.我意识到我可以使用该-C标志来丢弃我的更改,但我试图update在不同的场景中关注命令的行为.

案例2:切换到分支机构

$ hg update <bname>
Run Code Online (Sandbox Code Playgroud)

这会将我的工作目录切换为<bname>分支.但是,在我明确使用该命令之前,我的未提交的更改不会合并merge.

案例3:从远程存储库更新提取的更改集

$ hg pull
$ hg update
Run Code Online (Sandbox Code Playgroud)

这会在最近一次之后再次我的工作目录与远程存储库中的更改集合并pull.

Joe*_*ant 5

Mercurial 1.9.1

它与变更集之间的关系有关.如果工作目录的父变更集与要更新的目标变更集之间存在直接路径,Mercurial将尝试使用合并操作传输工作目录中的更改.因此,如果您所使用的变更集是要更新的变更集的直接后代或直接祖先,它通常会起作用.

在下图中,字母表示分支名称,数字是顺序修订号.wd是工作目录.

当Mercurial合并未提交的更改时:

  • 在同一分支上更新:

    --A1----A3----A5---wd
       \          /
        A2------A4
    
    Run Code Online (Sandbox Code Playgroud)

    以上,基于A5进行了更改.如果您更新到A4,Mercurial将合并未提交的更改以传输它们.

    --A1----A3----A5---A6---wd
       \          /
        A2------A4
    
    Run Code Online (Sandbox Code Playgroud)

    此外,如果有其他更改集(例如A6),这仍然有效,因为A4

  • 更新到不同的分支(这次,更新到B4):

    --A1----A3----A5---wd
       \          /
        B2------B4
    
    Run Code Online (Sandbox Code Playgroud)

    以上,修订24是在不同的分支,最近已经重新合并到分支一个.Mercurial还将转移未提交的更改,因为A5B4是如此密切相关.并且:

    --A1----A3----A5---A6---wd
       \          /
        B2------B4
    
    Run Code Online (Sandbox Code Playgroud)
  • 同样,当您从远程仓库中提取新更改时,通常它们将是作为工作目录的父级的变更集的后代,因此它提供了直接关系,使得可以合并未提交的更改:

    --A1----A3----A5---A6---wd
       \          /     \
        A2------A4       A7---A8---A9   (A7 through A9 pulled)
    
    Run Code Online (Sandbox Code Playgroud)

当Mercurial 不会合并未提交的更改时:

  • 在同一分支上更新:

    --A1----A3----A5
       \          /
        A2------A4---A6---wd
    
    Run Code Online (Sandbox Code Playgroud)

    以上,基于A6进行了更改.如果您更新到A5,Mercurial将拒绝,说"未完成的未提交更改"或"跨越分支".这是因为您尝试将未提交的更改从一个头部合并到另一个头部,并且(根据定义)它们不是彼此的祖先或后代.当然,命名分支也是如此:

    --A1----A3----A5
       \          /
        B2------B4---B6---wd
    
    Run Code Online (Sandbox Code Playgroud)

绕过它

当Mercurial不会自动尝试合并未提交的更改时,您可以通过几种不同的方式将更改移动到新父级:

  • 搁置更改,更新,然后取消搁置(手动处理冲突).
  • 在MQ中创建补丁会做同样的事情,因为搁架使用相同的补丁,而不是它们的队列.您将刷新补丁,弹出补丁,更新到其他分支,然后推送补丁(手动处理冲突).
  • 提交变更集,将其重新绑定到其他分支(您将必须完成合并过程),然后将其导入MQ,以便它不再是变更集而是补丁.