代码之家  ›  专栏  ›  技术社区  ›  Ashwin Nanjappa

Mercurial:如何合并手动控制更改和文件?

  •  4
  • Ashwin Nanjappa  · 技术社区  · 14 年前

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

    我将用一个例子解释我的查询。假设我从一个mercurial存储库开始设计一个 汽车 :

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

    我在汽车设计方面工作了很长一段时间,仓库看起来像:

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

    在某个时间点我分支 违约 茄科 并联使用太阳能汽车:

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

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

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

    如何合并 太阳农场 返回 违约 ?

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

    1. 我应该能够在这两个方面继续工作 违约 茄科 合并后。
    2. 可能会有燃油效率修正 Car.cpp Car.h 在里面 太阳农场 我想拉进去的 违约 但是,我不希望这些文件中的所有更改。所以,我想挑选我想包括在 违约 在合并过程中(即手动合并)。
    3. 我愿意 希望 Solar.cpp Solar.h 出现在 违约 . 世界可能还没有为太阳能汽车做好准备。;-)

    我学到的:

    1. 这可以通过 hg merge SolarCarBranch
    2. 这可以通过设置 kdiff3.premerge=False 在里面 Mercurial.ini
    3. 我不知道怎么做到这一点,因为 premerge=False 仍合并/复制 表面活性剂 太阳能 进入之内 违约 没有征得我的同意。
    2 回复  |  直到 14 年前
        1
  •  5
  •   Ry4an Brase    14 年前

    你真的很亲密,你不需要采取移植(糟糕)或樱桃采摘一般。关闭预合并是第一步,然后在合并之后提交之前删除主分支中不需要的文件。你只需要做一次。

    这里有一个设置:

    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向太阳能分支添加了一个文件——默认情况下我们不需要这个文件。虽然变更集3调整了一个也存在于主文件、文件中的文件,但我们希望手动控制该更改是否发生。

    所以做 hg update default ; hg merge -r solar . 合并工具将弹出 afile 如果我们想要这些改变,我们可以一行一行地决定或者一块一块地决定。储蓄后,做一个 hg stat :

    % hg stat
    M afile
    M solar-only
    

    我们看到,在违约的情况下,太阳能公司只是排队等待承诺。 删除它 if )

    % hg rm -f solar-only
    

    现在 汞柱 显示为已删除:

    % hg stat
    M afile
    R solar-only
    

    当我们承诺的时候,我们将在新的变更集中得到我们想要的。

        2
  •  2
  •   gavinb    14 年前

    您的第一个条件是,为了能够在两个分支上继续工作,只需不关闭分支即可满足(您可以使用 --close-branch 选择 hg commit )

    您可以使用 Transplant extension . 这将使您只选择要合并到默认值中的特定变更集。

    第三个条件是满足的想法,如果你不混合改变你的常规汽车和太阳能汽车在同一个承诺,你可以从太阳能分支收回改变不受惩罚,并且不必担心混合你的汽车类型。

    你可能想看看 internal 中的选项标志 merge configuration docs 也一样。