4

注意:我在这里描述的场景在Stack Overflow: Completely manual Mercurial merge中没有得到回答。

我将用一个例子来解释我的查询。假设我开始使用 Mercurial 存储库来设计汽车

C:\Car$ dir
Car.cpp
Car.h

我在 Car 的设计上工作了很长一段时间,存储库看起来像:

r0-r1-...-r100-(default)

在某个时间点,我默认分支到SolarCarBranch以并行处理太阳能汽车:

C:\SolarCar$ dir
Car.cpp
Car.h
Solar.cpp
Solar.h

再过一段时间,存储库看起来像:

r0-r1-...-r100-...-r200-(default)
            \--r101-...-r201-(SolarCarBranch)

如何将SolarCarBranch合并回默认值

请注意我想要的合并中的以下并发症:

  1. 合并后,我应该能够继续在defaultSolarCarBranch上工作。
  2. 我希望将SolarCarBranch 内部Car.cpp和内部Car.h的燃油效率修复程序拉入default,但是我不希望这些文件中的所有更改。所以,我想在合并(又名手动合并)期间挑选我希望包含在默认值中的更改。
  3. 不想出现在defaultSolar.cpp世界可能还没有为太阳能汽车做好准备。;-)Solar.h

我学到:

  1. 这是可能的hg merge SolarCarBranch
  2. 这可以通过设置来kdiff3.premerge=False实现Mercurial.ini
  3. 我不知道如何实现这一点,因为premerge=False仍然合并/复制Solar.cppSolar.h进入默认状态,而无需征求我的许可。
4

2 回答 2

5

你真的很接近,你不需要求助于移植(恶心)或一般的樱桃采摘。关闭 premerge 是第一步,然后在合并后但在提交之前删除主分支中不需要的文件。你只需要做一次。

这是一个设置:

o  changeset:   3:343d531512a3
|  branch:      solar
|  tag:         tip
|  parent:      1:cb26642f8db5
|  user:        Ry4an Brase <ry4an@msi.umn.edu>
|  date:        Wed Mar 10 11:16:48 2010 -0600
|  files:       afile
|  description:
|  solar-change
|
|
| @  changeset:   2:c5d14e34db07
| |  parent:      0:56465175b2fc
| |  user:        Ry4an Brase <ry4an@msi.umn.edu>
| |  date:        Wed Mar 10 11:05:44 2010 -0600
| |  files:       other-main-file
| |  description:
| |  moremain
| |
| |
o |  changeset:   1:cb26642f8db5
|/   branch:      solar
|    user:        Ry4an Brase <ry4an@msi.umn.edu>
|    date:        Wed Mar 10 11:04:32 2010 -0600
|    files:       solar-only
|    description:
|    solar-initial
|
|
o  changeset:   0:56465175b2fc
   user:        Ry4an Brase <ry4an@msi.umn.edu>
   date:        Wed Mar 10 11:04:14 2010 -0600
   files:       afile
   description:
   initial

您可以看到变更集 1 向 solar 分支添加了一个文件——这是我们默认不需要的文件。虽然变更集 3 调整了一个也存在于 main、afile 中的文件,但我们希望手动控制该更改是否发生。

就这样吧hg update default ; hg merge -r solar。合并工具将弹出,afile如果我们想要这些更改,我们会逐行或逐块决定。保存后执行hg stat

% hg stat
M afile
M solar-only

我们看到 Solar-only 在默认情况下排队等待提交。 只需将其删除(使用if)。

% hg rm -f solar-only

现在hg stat将其显示为已删除:

% hg stat
M afile
R solar-only

当我们提交时,我们将在新的变更集中拥有我们想要的东西。

于 2010-03-10T17:24:41.270 回答
2

您的第一个条件,即能够继续在两个分支上工作,只需不关闭分支(您可以使用--close-branchto 选项执行此操作hg commit)即可满足。

您可以使用移植扩展挑选要合并的变更集。这将允许您仅选择特定的变更集以合并到默认值中。

第三个条件满足的想法是,如果您不在同一个提交中混合更改您的普通汽车和太阳能汽车,您可以从太阳能分支中拉回变更集而不受惩罚,而不必担心混合您的汽车类型。

您可能还想查看合并配置文档internal中的选项标志。

于 2010-03-10T06:54:25.173 回答