我在*.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
我在这里想念的是什么?
谢谢。
答案 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节点的差异友好表示,包括其子节点的名称,也提供服务的名称作为目录中的文件名,包含代表名称的所有小文件。