如果没有要合并的话,如何在Mercurial中合并两个分支

Dan*_*ish 31 version-control merge mercurial

我是一个善变的人,我正在尝试做一些非常简单但却无法弄清楚如何做的事情.我创建了一个分支来做一些实验而不会打扰主分支.

trunk       A -- B -- C
                       \
experiment              D -- E -- F
Run Code Online (Sandbox Code Playgroud)

我喜欢实验的方式,并希望将它与trunk合并并获得

trunk       A -- B -- C -- D -- E -- F
Run Code Online (Sandbox Code Playgroud)

但是,由于'trunk'分支中没有任何改变,合并表示没有任何合并,这是公平的.我只需要结束一个名为"trunk"的分支.我怎样才能做到这一点?

ang*_*son 66

Mercurial中的合并始终以下列方式工作:

  1. 更新到其中一个分支(请参阅下面的注释,了解为什么要选择其中一个分支,而不仅仅是选择一个随机分支)
  2. 与其他分支合并

例如,在您的情况下,您会这样做:

hg update trunk
hg merge experiment
Run Code Online (Sandbox Code Playgroud)

选择要更新的正确分支

选择要更新的分支以及要合并的分支时需要考虑一些事项,这与书签和分支名称有关.

先取分支名称.如果您首先更新到主干分支,然后与实验合并,则合并变更集将位于主干分支上.

但是,如果您更新到实验分支,与trunk合并,则合并变更集将在实验分支上.

在考虑合并的原因时,这一点很重要.您是否正在将实验合并到主干中,或者您是否正在使用主干上发生的其他更改来更新实验.

对于书签,对于较新版本的Mercurial,书签是不可或缺的一部分,如果您更新为书签,请说如下:

hg update moving-target
Run Code Online (Sandbox Code Playgroud)

然后提交,该书签将遵循您的提交,即.它会向前发展.

在这种情况下,如果在主干分支的头部有一个名为moving-target的书签,并更新到该书签,则合并变更集在提交时将向前移动该书签.


dls*_*dls 13

一旦创建了分支,就无法完全实现单个默认分支(有一些例外情况,请参见下文).但是,你应该能够合并experimentdefault,实现同样的事情.

如果你从这开始:

在此输入图像描述

并执行此操作:

hg update trunk
hg merge experiment
Run Code Online (Sandbox Code Playgroud)

你应该最终得到这个:

在此输入图像描述

其他选择:

使用rebase补丁队列,您实际上可以重新定位experiment分支上的变更集default.这基本上会删除experiment命名分支并创建一些default更改集.但是,如果您已经与另一个用户共享上面第一张图像的更改集,则无法执行此操作.