最终将使用哪个版本的git文件:LOCAL,BASE还是REMOTE?

时间:2012-06-21 07:15:04

标签: git git-merge meld

git merge期间有一个碰撞时,我打开一个名为Meld的合并工具。它打开三个文件LOCAL,BASE和REMOTE。正如我读过LOCAL是我的本地分支,BASE是共同的祖先,REMOTE是要合并的分支。

现在我的问题是:最终会使用哪个版本的文件?是REMOTE吗?如果是这样,我可以根据需要编辑它,不管BASE分支中的内容是什么?

8 个答案:

答案 0 :(得分:131)

这是中间人:BASE

事实上,BASE不是共同的祖先,而是半完成的合并,其中冲突标有>>>><<<<

您可以在meld编辑窗口的顶部看到文件名。

See the screenshot here

meld base

您可以根据需要编辑BASE文件,无论是否使用meld命令 你也可以摆脱融合,只需用你喜欢的文本编辑器编辑文件。

  • <<<< HEAD=====标记之间的代码是合并前的本地文件之一。
  • ====>>>> <branch name>之间的代码是远程文件之一。

答案 1 :(得分:106)

Meld通过传递第4个参数激活了隐藏的3向合并功能

meld $LOCAL $BASE $REMOTE $MERGED

右侧和左侧窗格以只读模式打开,因此您不会意外地合并错误的方式。中间窗格显示合并的结果。对于冲突,它显示基本版本,以便您可以看到所有重要位:中间的原始文本和两侧的冲突修改。最后,当您按下“保存”按钮时,会写入$ MERGED文件 - 与git完全一样。

我使用的〜/ .gitconfig文件包含以下设置:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

这打开了3个选项卡,第1和第2个选项卡包含我正在尝试合并的简单差异,第3个选项卡默认打开,显示3向合并视图。

现在,隐藏功能的原因是它还没有足够的打磨。它现在非常有用,但是合并作者Kai Willadsen指出几个需要熨烫的皱纹。例如,没有用于启动3向合并模式的GUI,命令行语法有点晦涩,等等。如果你说python并且有时间在手上 - 你知道该怎么做。

编辑: 在较新版本的Meld中,synax略有变化。这是在评论中,但它属于答案。

meld命令现在使用--output选项,因此上面代码段的最后一行应为:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

答案 2 :(得分:51)

涉及4个文件:

  1. $LOCAL 您要合并的分支上的文件; 在向您显示合并过程时未触及

  2. $REMOTE 您要合并的分支上的文件; 在向您显示合并过程时未触及

  3. $BASE $ LOCAL和$ REMOTE的共同祖先,即。两个分支开始转移所考虑的文件的点; 在向您显示合并过程时未触及

  4. $MERGED 部分合并的文件,有冲突; 这是合并过程中唯一触及的文件,实际上,从未在meld

  5. 中显示给您

    $MERGED文件是包含<<<<<<>>>>>>=====(以及可能的||||||)标记(分隔冲突)的文件。 是您手动编辑 以纠正冲突的文件。

    手动冲突编辑和视觉冲突编辑在不同文件上完成,并显示不同的信息。

    使用mergetool(假设为meld)时,其中显示的文件为:$LOCAL$BASE$REMOTE。请注意,您没有看到$MERGED文件,尽管这是作为隐藏参数传递给meld以在那里写入编辑结果。

    换句话说,在meld中,您正在编辑中间的文件$BASE文件,然后从左侧或右侧手动选择所有更改。这是一个干净的文件,合并过程没有触及。唯一的问题是,当您保存时,您不会保存到$BASE文件中,而是保存在meld的第四个隐藏参数中,即$MERGED文件(您不是甚至看到)。 $BASE文件包含任何冲突或部分成功合并,因为它不是$MERGED文件

    在可视化编辑中,当向您展示$BASE文件(而不是$MERGED文件)git时,基本上会丢弃所有进行合并的尝试(这些尝试都是可见的,如果你愿意,可以在$ MERGED文件中)让你完全从头开始合并

    最重要的是,在手动和视觉合并冲突中,您不会查看相同的文件,但最终结果会写在同一个文件中(即$MERGED文件)。

    手动纠正冲突是在$MERGED上完成的,因为git 无意义向您展示三个文件,因此它会压缩三个文件中的信息({该$LOCAL文件中的{1}},$BASE$REMOTE}。

    但是,可视化工具有方法向您显示三个文件:它们会显示$MERGED$LOCAL$BASE个文件。您正在从$REMOTE$LOCAL文件中选择更改,并将这些更改带入$REMOTE文件,完全重新构建甚至覆盖合并失败的尝试{{1文件。

答案 3 :(得分:15)

Cosmin的解决方案有效,但 $ BASE 文件已更新 - 而不是 $ MERGED 。这将更新 $ MERGED 文件:

Meld:v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

答案 4 :(得分:13)

Meld 1.7 Tomek Bury的解决方案不再适用。

默认设置不满足我:

Default settings

相反, Meld&gt; = 1.7 我建议使用其他两个解决方案之一。

第一个解决方案

 meld $LOCAL $BASE $REMOTE --auto-merge

first solution

第二个解决方案

 meld $LOCAL $MERGED $REMOTE

second solution

<强>的.gitconfig

复制&amp;将其粘贴到.gitconfig文件中以获得上述解决方案:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

复制&amp;将其粘贴到.gitconfig.local文件中,以便在您在多台计算机上使用.gitconfig时,仅为此计算机设置meld17或meld16:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

答案 5 :(得分:11)

我发现所有默认文件都没有保存。 meld默认显示$LOCAL$REMOTE$BASE。为了使其有效,我需要将meld show $MERGED代替$BASE。把它放在我的~/.gitconfig为我修复它:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

我正在使用Arch,其中包含:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

答案 6 :(得分:2)

由于某些原因,最新版本的meld不会显示为冲突添加的标记线(&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;,&gt;&gt;&gt;&gt;&gt;&gt;&gt; &gt;&gt;&gt;)。如果要查看这些行,则应安装meld v 1.3.3或之前的版本。

答案 7 :(得分:2)

请参阅Saad的答案以获得正确的答案。

在Ubuntu上使用meld 1.8.1我得到了

  

提供给--diff

的参数数量错误

并在$ MERGED之前添加--output为我修复了它:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED