0

我有*.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

请问我在这里缺少什么?

谢谢你。

4

1 回答 1

0

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

在某些情况下这是合适的,但是,正如您所经历的那样,XML 不是其中之一。对于 XML 文件,您可能最好使用默认的合并算法,它会遇到冲突,使用 "<<<<<<<<"、"=======" 和 ">> 丢弃您的 XML >>>>>" 冲突标记(我没有计算,不要按字面意思理解),在索引中标记冲突的文件(使用“git log --merge --left-right -p”可以看到详细信息),合并失败,不提交,并强制您通过编辑冲突文件以删除冲突标记和“git add”来解决冲突,然后才能进行提交。

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

于 2015-01-25T06:08:13.553 回答