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

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

现在到我的问题:哪个版本的文件将被最终使用? 它是远程的吗? 如果是这样,我可以编辑它,不pipe是什么在BASE分支例如?

这是在中间的一个: BASE

实际上, BASE不是共同的祖先,而是用>>>><<<<来标记冲突的半合并。

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

看这里的截图

融合基地

您可以根据需要使用或不使用meld命令来编辑BASE文件。
你也可以摆脱融合,只需用你最喜欢的文本编辑器编辑文件。

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

Meld通过传递第四个参数来激活隐藏的三向合并function

 meld $LOCAL $BASE $REMOTE $MERGED 

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

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

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

这将打开融合3标签,第一和第二个选项卡包含我想要合并的简单差异,第三个标签,默认打开,显示3路合并视图。

现在,该function被隐藏的原因是它还没有足够的抛光。 它现在是非常有用的,但是合唱作家凯·威拉德森(Kai Willadsen)指出,皱纹很less,需要熨平。 例如,没有GUI来启动3路合并模式,命令行语法有点神秘,等等。 如果你说python,并有一些时间在你手上 – 你知道该怎么做。

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

meld命令现在使用–output选项,所以上面代码片段的最后一行应该是:

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

有4个文件涉及:

  1. $LOCAL你正在合并的分支上的文件; 在向您展示时不受合并过程的影响

  2. $REMOTE你正在合并的分支上的文件; 在向您展示时不受合并过程的影响

  3. $BASE $ LOCAL和$ REMOTE的共同祖先,即。 两个分支开始转移所考虑的文件的地方; 在向您展示时不受合并过程的影响

  4. $MERGED部分合并的文件,有冲突; 这是合并过程所触及的唯一文件,实际上,从来没有向您展示过


$MERGED <<<<<<文件是包含<<<<<<>>>>>>===== (也可能是

)标记(即分隔冲突)的文件。 是您手动编辑以纠正冲突的文件。

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

当使用mergetool(假设meld )时,其中看到的文件是: $LOCAL$BASE$REMOTE 。 请注意,您不会看到$MERGED文件,尽pipe这是作为隐藏parameter passing的,以便meld编辑结果写入其中。

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

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

底线是在手动和可视化合并冲突中,您不是在查看相同的文件,但最终的结果是写入同一个文件(即$MERGED文件)。

手动纠正​​冲突是在$MERGED上完成的,因为git 没有意义向你展示三个文件,所以它压缩了$MERGED文件中的三个文件( $LOCAL$BASE$REMOTE )的信息。

但是可视化工具有办法向您显示三个文件:它们向您显示$LOCAL$BASE$REMOTE文件。 您正在从$LOCAL$REMOTE文件中select更改,并将这些文件引入到$BASE文件中,完全重新构build甚至覆盖合并失败的尝试,即$MERGED文件。

Cosmin的解决scheme工作,但$ BASE文件更新 – 不$合并 。 这将更新$ 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 

随着梅尔德1.7 Tomek Bury解决scheme不再工作。

默认设置不满足我:

默认设置

相反,对于梅尔德> = 1.7,我build议其他解决scheme之一。

第一个scheme

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

第一个方案

解决scheme二

  meld $LOCAL $MERGED $REMOTE 

第二个方案

的.gitconfig

复制并粘贴到你的.gitconfig文件中,得到如上所述的解决scheme:

 [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 

复制并粘贴到.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 

我发现没有显示的默认文件正在保存。 默认显示$LOCAL$REMOTE$BASE 。 为了使它工作,我需要使融合显示$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 

出于某种原因,最新版本的meld不会显示为冲突而添加的标记行(<<<<<<<,=======,>>>>>>>)。 如果你想看到这些行,你应该安装meld v 1.3.3或以前。

请看萨阿德的答案是否正确。

随着融合在Ubuntu Ubuntu 1.8.1我得到了

提供给–diff的参数错误数目

在$ MERGED之前添加–output为我修复:

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