【问题标题】:Mercurial: How to merge with manual control over changes & files?Mercurial:如何与手动控制更改和文件合并?
【发布时间】:2010-03-10 05:33:43
【问题描述】:

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

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

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

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

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

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

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

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

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

如何将 SolarCarBranch 合并回 default

注意我想要的合并中的以下复杂性:

  1. 我应该能够在合并后继续使用 defaultSolarCarBranch
  2. 我希望将 SolarCarBranch 中的 Car.cppCar.h 中的燃油效率修复程序引入 default,但我不希望这些中的所有更改文件。因此,我想在合并(也称为手动合并)期间挑选出我希望包含在 default 中的更改。
  3. 我确实希望Solar.cppSolar.h出现在默认中。世界可能还没有为太阳能汽车做好准备。 ;-)

我学到了什么:

  1. 这可以通过hg merge SolarCarBranch
  2. 这可以通过在Mercurial.ini中设置kdiff3.premerge=False来实现
  3. 我不知道如何实现这一点,因为 premerge=False 仍然在未经我许可的情况下将 Solar.cppSolar.h 合并/复制到 default 中。

【问题讨论】:

    标签: mercurial merge manual


    【解决方案1】:

    您真的很亲近,一般来说,您不需要求助于移植(恶心)或樱桃采摘。关闭 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
    

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

    【讨论】:

    • 删除那些文件!我怎么错过了!非常感谢! :-)
    【解决方案2】:

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

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

    如果您不在同一提交中混合更改常规汽车和太阳能汽车的想法,则可以满足第三个条件,您可以不受惩罚地从太阳能分支中拉回变更集,并且没有担心混合您的汽车类型。

    您可能还想查看merge configuration docs 中的internal 选项标志。

    【讨论】:

    • 听起来我需要挑选樱桃
    • 真的吗?我不认为樱桃采摘是必要的。只要关闭预合并,您仍然可以控制逐块或逐行添加每个更改。樱桃采摘只是不必手动拒绝某些 cset 中的更改的简写,但您始终可以对它们说“不”。我真的建议不要使用移植扩展,因为那样你的回购中有两次相同的更改,有两个不同的哈希 ID。
    • @Ry4an 我曾想过按照您的描述建议手动提交,但是当我编写它时,transplant 似乎更容易。但是您的解释使我确信这是更好的选择,尤其是您关于具有两个不同哈希的相同变更集的观点。所以我赞成你的回答,并建议 OP 接受它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2011-07-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多