Mercurial:如何使用两个 "main branches"

Mercurial: How to work with two "main branches"

我有一个项目的 Mercurial 存储库,该项目必须拆分为两个分支,这两个分支将共享主要功能,但在某些功能上会有差异:

            ---- B
           /
---source-+----- A

现在我想知道我是如何处理它的。

                          ----- new feature -------
                         /                         \
            ---- B1 ----+ B2 --- B3 ----- bugfix ---+- MERGE ---
           /
---source-+----- A1 ---- A2 ------------------------------------

让我们假设 A1、B1、B2 等是简单的更改,它们应该只出现在特定的分支中(更新徽标、更改文本...)。但是我想在两个分支中同时拥有 "new feature" 和 "bugfix"。

显然我不能将分支 B 合并到 A 中,否则我最终会在 A 中对 B 所做的所有更改(但我不想要更新的徽标)。

所以:我该怎么做?我真的必须按照 this question 中的建议使用第三个分支吗?这将迫使我适应全新的工作流程。

另一个related question建议移植和嫁接。这是要走的路吗?

这两种方式都可以,看你最喜欢什么:

a) 有三个分支,一个主线拥有每个项目/客户所需的一切 - 两个客户分支相对于主线有特定的更改,更改徽标或文本。 Mainline 接收错误修复和新功能,并定期合并到客户分支中。这样他们就不会 "contaminate" 彼此。

b) 将它保存在两个分支中,每个客户一个,并将与两个分支相关的更改移植到另一个分支。

选择 a) 或 b) 是一个品味问题,在我看来,更多的问题是你是否会有更多的变更集由两者共享(然后是 3 个分支,更少的嫁接),或者你是否有更多的变更集特定于一个分支或另一个分支 - 然后嫁接就更少了。不过,我可能几乎总是会选择 a);感觉 "cleaner".

其实还有一个选项c): 把两个分支合并到一起,合并的时候注意不要合并另一个分支特有的东西。但这可能非常乏味,至少在漫长的 运行 中是这样;这主要取决于差异的复杂性以及它们相对于一般变化的位置。如果细节在他们自己的文件中,在合并过程中合并和跳过 "wrong" 更改相对容易。