如何将一个分支与同一父级的其他分支合并,但在mercurial中仅排除变更集
我有一个分支a1,它的父分支是a。现在我已经从同一个父分支a创建了另一个分支a2。我想将a1与a2合并,不包括a1中的chengeset。是否有一种方法可以部分合并不包括变更集的分支?简短的回答是否:合并根据图形拓扑而不是分支名称工作 较长的答案仍然是否定的,但值得绘制拓扑图。您的描述谈到分支的父级关系,但分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。(提交具有父/子关系,或者更一般地说,具有祖先/后代关系。)因此: 我有一个分支a1,它的父分支是a 这实际上意味着您有一些提交,其分支名称为如何将一个分支与同一父级的其他分支合并,但在mercurial中仅排除变更集,mercurial,branch,changeset,hg-merge,Mercurial,Branch,Changeset,Hg Merge,我有一个分支a1,它的父分支是a。现在我已经从同一个父分支a创建了另一个分支a2。我想将a1与a2合并,不包括a1中的chengeset。是否有一种方法可以部分合并不包括变更集的分支?简短的回答是否:合并根据图形拓扑而不是分支名称工作 较长的答案仍然是否定的,但值得绘制拓扑图。您的描述谈到分支的父级关系,但分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。(提交具有父/子关系,或者更一般地说,具有祖先/后代关系。)因此: 我有一个分支a1,它的父分支是a 这实际上意味着您有一
a1
,其中一个或多个提交有父提交,其分支名称为A
。如果我们绘制它们,我们会得到,例如:
A: ...--o--o--o
\
a1: o--o
现在我已经从同一个父级A创建了另一个分支a2
同样,这意味着您还有更多的提交(及其版本号),其分支名称为a2
;至少有一个这样的提交具有分支名称为a
的父级;我们可以用很多种方法来画,但让我们试试这个:
a2: o--o
/
A: ...--o--o--o
\
a1: o--o
我想将a1与a2合并,从a1中排除chengeset
您并没有真正合并分支。而是合并提交。这样做的同时,将一些提交签出到工作树中。此工作树副本是建议的下一个提交,根据定义,您位于某个分支上。然后运行hgmerge
,并指定一些其他修订:在该分支或任何其他分支上的提交。假设合并有意义,Mercurial将开始合并过程。合并完成后,新提交将以当前分支作为其分支,并将工作树的父提交作为其第一个父级,提供的修订作为其第二个父级
因此,在这里,您可以hg update a2
选择a2
的提示作为复制到工作树中的提交。工作树是a2
的一个建议的但尚未实际的新提交,其父级是现在标记为@
的提交:
a2: o--@
/
A: ...--o--o--o
\
a1: o--o
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o [want to merge this commit]
有没有办法部分合并不包括变更集的分支
您可以选择a1
上的两个提交(我们这里只画了两个)中的任何一个作为hg merge
操作的目标。假设您使用hg merge a1
选择第二个:
a2: o--@
/
A: ...--*--o--o
\
a1: o--●
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o
\
a3: ----o--o--●
填充的圆圈是提交合并@
是工作树的父级;因此,*
是它们的合并基础,也是最好的共同祖先提交。Mercurial会将*
中的快照内容与@
中的快照内容进行比较(或者启动流程时,这些内容的工作树应该相同),并且还会将*
中的快照内容与中的快照内容进行比较●代码>。这两个比较分别产生一个整体变更集:●在*
和●代码>。Merge将简单地合并这两个整体变更集(然后应用于基础内容)
当然,您可以选择另一个a1
commit进行合并,但是您将使用它的快照,而不是●代码>。这将有效地排除●代码>-可能不是您想要的
让我们再画第三张图,因为这张图对我们来说有点肤浅。假设不只是对a1
独占的两个提交,而是有很多。但是其中一个,我们将在这里绘制为x
,我们希望在合并到@
时排除:
a2: o--@
/
A: ...--o--o--o
\
a1: o--o
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o [want to merge this commit]
要实现您想要的,您必须首先进行新的提交,可能是在a1
上,也可能是在一个新的分支上。这些新提交将如下所示:
a2: o--@
/
A: ...--*--o--o
\
o--o--o--x--o--o--o
a1: \
----o--o--o
在本例中,我将新提交绘制为a1
中的一个新的小分支,但是在一个新分支a3
上创建它们可能会更清楚:
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o
\
a3: ----o--o--o
在这两种情况下,三个新提交都只是提交x
后发生的变更集的副本。使用a3
时,制作这些副本的简单方法是使用hg-graft
。现在我们可以选择a3
的提示提交作为要合并到a1
中的提示提交:
a2: o--@
/
A: ...--*--o--o
\
a1: o--●
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o
\
a3: ----o--o--●
合并的结果将是合并提交,它将绑定到旧的@
-新合并是当前提交,因此现在是@
-和●代码>:
a2: o--o---------------@
/ /
A: ...--*--o--o /
\ /
a1: o--o--o--x--o--o--o /
\ /
a3: ----o--o---●
合并仍然使用拓扑,而不是分支名称
(这是Mercurial的一个关键实现:分支名称只是组合提交;但真正控制事情的是图形拓扑。)简短的回答是否:根据图形拓扑而不是分支名称合并工作
较长的答案仍然是否定的,但值得绘制拓扑图。您的描述谈到分支的父级关系,但分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。(提交具有父/子关系,或者更一般地说,具有祖先/后代关系。)因此:
我有一个分支a1,它的父分支是a
这实际上意味着您有一些提交,其分支名称为a1
,其中一个或多个提交有父提交,其分支名称为A
。如果我们绘制它们,我们会得到,例如:
A: ...--o--o--o
\
a1: o--o
现在我已经从同一个父级A创建了另一个分支a2
同样,这意味着您还有更多的提交(及其版本号),其分支名称为a2
;至少有一个这样的提交具有