当git merge
期间有一个碰撞时,我打开一个名为Meld的合并工具。它打开三个文件LOCAL,BASE和REMOTE。正如我读过LOCAL是我的本地分支,BASE是共同的祖先,REMOTE是要合并的分支。
现在我的问题是:最终会使用哪个版本的文件?是REMOTE吗?如果是这样,我可以根据需要编辑它,不管BASE分支中的内容是什么?
答案 0 :(得分:131)
这是中间人:BASE
。
事实上,BASE
不是共同的祖先,而是半完成的合并,其中冲突标有>>>>
和<<<<
。
您可以在meld编辑窗口的顶部看到文件名。
您可以根据需要编辑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个文件:
$LOCAL
您要合并的分支上的文件; 在向您显示合并过程时未触及
$REMOTE
您要合并的分支上的文件; 在向您显示合并过程时未触及
$BASE
$ LOCAL和$ REMOTE的共同祖先,即。两个分支开始转移所考虑的文件的点; 在向您显示合并过程时未触及
$MERGED
部分合并的文件,有冲突; 这是合并过程中唯一触及的文件,实际上,从未在meld
$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的解决方案不再适用。
默认设置不满足我:
相反, Meld&gt; = 1.7 我建议使用其他两个解决方案之一。
第一个解决方案:
meld $LOCAL $BASE $REMOTE --auto-merge
第二个解决方案:
meld $LOCAL $MERGED $REMOTE
<强>的.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