我有一个可以比较和合并二进制文件的工具。它还可以尝试自动化所述二进制文件和中止,如果有没有人为干预无法决定的更改。是否可以配置git使用我的工具来检测合并是否会导致合并冲突?
例如,假设它可以处理.png文件。如果我有两个分支A和B,并且在分支A上对[150,100]
处的像素进行了更改,而在分支B处对[200, 50]
处的像素进行了更改。如果我现在将分支B合并到分支A中,我的工具将检测到没有冲突的更改,只是自动注释图像而不会引发冲突。
TL; DR:你想要一个合并驱动程序,你为.gitattributes
中的某些文件声明了这个驱动程序。 (驱动程序本身,您在.git/config
中配置。请参阅the gitattributes documentation。)
您无法配置Git如何决定某些文件需要合并。决策算法太简单了,因为它包括:
path/to/abc.png
的文件,并且双方也有名为path/to/abc.png
的文件。 Git假设所有三个名称代表相同的底层文件。
例如,如果右边(--theirs
)没有path/to/abc.png
,但确实有different/path/to/xyz.png
并且该文件似乎是新创建的(合并基础中不存在)并且xyz.png
的内容与基地的abc.png
,Git可能会选择用基础的xyz.png
来识别他们的abc.png
,但现在右侧有一个名称更改以及潜在的内容差异。这个重命名文件是一个高级别的变化。
同样,如果一方完全删除文件,这也是一个高级别的更改。 (如果双方都完全删除了文件,那么这里没有问题:合并结果只是“删除文件”。)由于没有不匹配的文件(例如这个新创建的文件)而导致一方或双方删除文件的决定。 xyz.png
)看起来非常相似。如果此时检测到的冲突是高级冲突,Git将停止并获得帮助。但是,如果合适,它可能首先继续在三个输入文件上调用合并驱动程序。
抛开任何高级冲突或合并要求,Git现在决定是否在三个输入文件上调用低级合并驱动程序。如果(并且仅当)发生这种情况:
低级合并驱动程序是您通过.gitattributes
文件配置的驱动程序。如果你没有通过.gitattributes
配置一个,它可以是内置的文本文件合并驱动程序,也可以是内置的二进制文件合并驱动程序。
内置文本文件合并驱动程序尝试使用通常的diff-and-stick-merge-conflict-markers-in方法组合更改。如果存在低级文本合并驱动程序无法解决的冲突,Git将停止并获得帮助。
内置的二进制文件合并驱动程序只是声明失败。 Git会停下来寻求帮助。
如果您提供自己的合并驱动程序,则负责生成正确的合并结果和/或告知Git停止并获取帮助。因此,如果您有一个知道如何合并.png
文件的合并驱动程序,您可以将其设置为*.png
的低级合并驱动程序。
据我所知,如果你尝试合并涉及两个PNG或其他二进制文件,你将受Git的合并冲突检测算法的支配。该算法通过文本文件中的变化来标记合并冲突,所述变化涉及彼此的特定接近度内的差异(例如,彼此的若干行内的变化)。
虽然您不可能在Git中使用二进制合并工具,但您可能必须执行Git的自定义构建/分支才能实现它。
但是,一般情况下,你应该避免在Git中对二进制文件进行版本控制,因为它不能很好地处理二进制内容。