如何在git中使用merge = union自动合并后查看冲突

时间:2014-11-05 09:41:20

标签: git merge conflict gitattributes

我在*.csproj merge=union中有.gitattributes,我很高兴git如何管理与之合并。但是其他时候,git会在合并xml文件方面做得很差,例如*.csproj(因为我听不到合适的xml合并驱动程序),我再也无法加载VS项目了。

所以我git reset --hard HEAD^再次尝试使用git merge --no-commit --no-ff,这样我就可以在提交合并之前潜入峰值。

例如:

mkdir foobar && cd foobar
git init
echo "README merge=union" > .gitattributes
echo "Hello" > README
git add --all
git commit -m 'Initial commit.'
git checkout -b italian-translation
echo "Ciao" > README
git commit -am 'Italian translation'
git checkout master
git merge --no-commit --no-ff italian-translation

此时README包含:

Hello
Ciao

然后我尝试查看README的冲突版本,以便我可以深入研究冲突并手动解决:

git checkout -m README

我期待类似的东西:

<<<
Hello
===
Ciao
>>>

但我仍然得到:

Hello
Ciao

我在这里想念的是什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

通过指定“merge = union”,两个版本的文件的合并成功而没有冲突,并且“成功”合并被提交给master。

有些情况下这是合适的,但是,正如您所经历的那样,XML不是其中之一。对于XML文件,您最好使用默认合并算法,它会遇到冲突,将您的XML与“&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ====“和”&gt;&gt;&gt;&gt;&gt;&gt;&gt;“冲突标记(我没有计算,不按字面意思),标记索引中的冲突文件(详细信息可见“git log --merge --left-right -p”),合并失败,不做提交,强制您通过编辑冲突的文件来解决冲突,以便在允许您进行提交之前删除冲突标记和“git add”。

这是一种痛苦,对于一种XML文件,我编写了一个实用程序,它将这种XML文件转换为一个目录,其中包含表示XML树作为节点的小文本文件,以及可以翻译目录的对应文件。回到原始XML文件。然后,我告诉git忽略原始XML文件,并将派生目录置于版本控制之下,让文件合并发生在所有小的XML树节点表示中(只有两次经历过冲突)。我的雇主拥有该代码,或者我把它放在这里。但是,没有什么是可获得专利的:使用库解析XML并使用哈希表来命名节点及其子节点,并提出XML节点的差异友好表示,包括其子节点的名称,也提供服务的名称作为目录中的文件名,包含代表名称的所有小文件。