gpt4 book ai didi

Mercurial和 merge 工具?

转载 作者:行者123 更新时间:2023-12-04 07:29:33 31 4
gpt4 key购买 nike

当 merge 的两个分支对同一文件有更改时,Mercurial 是否总是使用外部 merge 工具?

或者它是否首先查看它是否可以 merge 文件本身,如果不能,则仅转向外部工具?

我问的原因是我(再次)重新阅读 tutorial written by Joel Spolsky on Mercurial在比较 Subversion 和 Mercurial 的 merge 方式时,他说的一件事是:

By contrast, while we were working separately in Mercurial, Mercurial was busy keeping a series of changesets. And so, when we want to merge our code together, Mercurial actually has a whole lot more information: it knows what each of us changed and can reapply those changes, rather than just looking at the final product and trying to guess how to put it together.



只是,我的经验告诉我,当两个分支对同一文件进行更改时,它似乎涉及外部 merge 工具。因此,这不会使上述论点不正确吗?

或者我应该这样解释:
  • Subversion 只 merge 两个分支的最终状态,在一个单元中还有更多的工作要做
  • Mercurial 单独 merge 每个变更集,这允许它处理更小的变更单元, merge 成功的机会更高

  • 有人可以对此有所了解吗?

    编辑 : 让我举个例子吧:
    @echo off

    setlocal

    if exist repo rd /s /q repo

    md repo
    cd repo
    hg init .

    rem --- version 0 ---
    echo 1 >test.txt
    echo 2 >>test.txt
    echo 3 >>test.txt
    echo 4 >>test.txt
    echo 5 >>test.txt
    hg add test.txt
    hg commit -m "v0"

    rem --- version 1 ---
    echo 1 >test.txt
    echo 2 v1 >>test.txt
    echo 3 >>test.txt
    echo 4 >>test.txt
    echo 5 >>test.txt
    hg commit -m "v1"

    rem --- version 2 ---
    hg update 0
    echo 1 >test.txt
    echo 2 >>test.txt
    echo 3 >>test.txt
    echo 4 v2 >>test.txt
    echo 5 >>test.txt
    hg commit -m "v2"

    rem --- merge ---
    hg update 1
    hg merge 2

    这首先创建一个包含以下内容的文件:
    1
    2
    3
    4
    5

    然后将其更改为:
    1
    2 v1
    3
    4
    5

    然后它返回到初始版本(变更集),并将其更改为:
    1
    2
    3
    4 v2
    5

    然后它尝试将两者 merge 。

    现在,根据(当前)唯一的答案,这应该不会造成问题,因为这些变化并不冲突。

    但是,此时会调用 Beyond Compare(我的外部 merge 工具)。

    最佳答案

    mercurial merging 和 svn merging 的最大区别在于,mercurial merge 算法可以访问被 merge 的两个修订版之间的最后一个共同祖先。如果你的历史看起来像

    A--B
    \-C

    svn 将使您的 merge 工具在 B 和 C 上丢失。Mercurial 将使用 A、B 和 C 启动您的工具,并且一些工具可以用它做更好的事情。

    Mercurial 在启动您的工具之前会进行自己的内部 merge ,在该工具中它使用 A、B 和 C 来做出一些明显的选择。您可以通过更改 premerge 来关闭它。工具的设置。

    您的测试没有给出很好的结果,因为您将 2 与其自己的祖先 merge 。如果你做一个 hg update 0在创建变更集 2 之前,你有一个这样的实际分支历史:
    @  changeset:   2:790856e061f4
    | tag: tip
    | parent: 0:bfba1d8f77af
    | user: Ry4an Brase
    | date: Fri Jul 09 16:50:34 2010 -0500
    | summary: added v2
    |
    | @ changeset: 1:7a9c581561b6
    |/ user: Ry4an Brase
    | date: Fri Jul 09 16:50:16 2010 -0500
    | summary: added v1
    |
    o changeset: 0:bfba1d8f77af
    user: Ry4an Brase
    date: Fri Jul 09 16:49:29 2010 -0500
    summary: first

    那么当你 hg merge你会得到:
    1
    2 v1
    3
    4 v2
    5

    没有您的 merge 工具启动。

    关于Mercurial和 merge 工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3215945/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com