【问题标题】:How to merge a branch with other branch of the same parent but exclude a changeset alone in mercurial如何将分支与同一父级的其他分支合并,但在 mercurial 中单独排除变更集
【发布时间】:2019-06-01 11:51:25
【问题描述】:

我有一个分支 a1,其父分支是 A。现在我从同一个父分支 A 创建了另一个分支 a2。我想将 a1 与 a2 合并,不包括 a1 中的 chengeset。有没有办法部分合并不包括变更集的分支?

【问题讨论】:

    标签: mercurial branch changeset hg-merge


    【解决方案1】:

    简短的回答是否定的:合并工作根据图拓扑,而不是分支名称。

    更长的答案仍然是否定的,但值得绘制拓扑。您的描述谈到了分支的亲子关系,但分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。 (提交有父/子,或更一般地说,祖先/后代,关系。)所以:

    我有一个分支 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。

    您并没有真正合并分支。相反,您合并提交。你这样做的同时将一些提交检出到工作树中——这个工作树副本是提议的下一个提交——根据定义,你在某个分支上。然后运行hg merge 并指定一些其他修订:在此或任何其他分支上的提交。假设合并有意义,Mercurial 将开始合并过程。合并完成后,新提交将以您当前的分支作为其分支,并将工作树的父提交作为其第一个父提交,并将提供的修订作为其第二父提交。

    所以在这里,您可以hg update a2 选择a2 的提示作为复制到工作树中的提交。工作树是 a2 的提议但尚未实际的新提交,其父级是现在标记为 @ 的提交:

    a2:              o--@
                    /
    A:  ...--o--o--o
              \
    a1:        o--o
    

    有没有办法部分合并不包括变更集的分支?

    您可以选择a1 上的两个(我们在这里只画了两个)提交中的任何一个作为hg merge 操作的目标。假设您选择了第二个,使用hg merge a1

    a2:              o--@
                    /
    A:  ...--*--o--o
              \
    a1:        o--●
    

    填充的圆圈是要合并的提交; @ 是工作树的父级;所以* 是他们的合并基础——最好的共同祖先提交。 Mercurial 会将* 中的快照内容与@ 中的快照内容(或工作树——启动进程时这些内容应该相同)进行比较,并比较* 中的那些人。这两个比较每个都会产生一个整体变更集: 中的内容是根据* 之间的o 中的内容修改的。 Merge 将简单地组合这两个整体变更集(然后将其应用于基础内容)。

    当然,您可以选择另一个a1 提交进行合并,但是您将使用它的快照,而不是 的快照。这将有效地排除 中的更改——可能不是您想要的。

    让我们再画第三张图,因为对于我们的目的来说,这张图有点浅。假设不仅仅是a1 独有的两个提交,我们还有很多。但是其中一个,我们将在这里绘制为x,我们希望在合并到@排除

    a2:              o--@
                    /
    A:  ...--*--o--o
              \
    a1:        o--o--o--x--o--o--o   [want to merge this commit]
    

    为了实现你想要的,你必须首先new提交,也许在a1,也许完全在一个新的分支上。这些新提交将如下所示:

    a2:              o--@
                    /
    A:  ...--*--o--o
              \
               o--o--o--x--o--o--o
    a1:               \
                       ----o--o--o
    

    在这种情况下,我将新提交绘制为一个新的迷你分支 within 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--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 的一个关键实现:分支名称只是组一起提交; 但真正控制事物的是 图拓扑。)

    【讨论】:

    • 不错,彻底,详细的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多