我可以配置git如何检测合并冲突

问题描述 投票:2回答:2

我有一个可以比较和合并二进制文件的工具。它还可以尝试自动化所述二进制文件和中止,如果有没有人为干预无法决定的更改。是否可以配置git使用我的工具来检测合并是否会导致合并冲突?

例如,假设它可以处理.png文件。如果我有两个分支A和B,并且在分支A上对[150,100]处的像素进行了更改,而在分支B处对[200, 50]处的像素进行了更改。如果我现在将分支B合并到分支A中,我的工具将检测到没有冲突的更改,只是自动注释图像而不会引发冲突。

git git-merge git-config
2个回答
1
投票

TL; DR:你想要一个合并驱动程序,你为.gitattributes中的某些文件声明了这个驱动程序。 (驱动程序本身,您在.git/config中配置。请参阅the gitattributes documentation。)

您无法配置Git如何决定某些文件需要合并。决策算法太简单了,因为它包括:

  1. 识别合并基础提交中的三个文件以及两个方面(左侧和右侧,或我们和他们的)。 也就是说,假设合并库有一个名为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)看起来非常相似。
  2. 现在我们/ Git已经将这三个文件识别为“相同”,如果满足以下任一条件,则需要进行非平凡的合并: 左右两侧都改变了内容,改为不同的内容。也就是说,文件的左侧和右侧提交中的blob哈希值不同,并且两者都与基本提交的blob哈希值不同。请注意,这并不意味着存在冲突!它只是意味着需要合并。 或者,至少有一方更改了内容,另一方进行了高级更改,例如重命名或删除文件。这自动是一个高级别的冲突。

如果此时检测到的冲突是高级冲突,Git将停止并获得帮助。但是,如果合适,它可能首先继续在三个输入文件上调用合并驱动程序。

抛开任何高级冲突或合并要求,Git现在决定是否在三个输入文件上调用低级合并驱动程序。如果(并且仅当)发生这种情况:

  • 实际上有三个文件(三个文件都没有丢失或删除),以及
  • 这三个不同的blob哈希值。

低级合并驱动程序是您通过.gitattributes文件配置的驱动程序。如果你没有通过.gitattributes配置一个,它可以是内置的文本文件合并驱动程序,也可以是内置的二进制文件合并驱动程序。

内置文本文件合并驱动程序尝试使用通常的diff-and-stick-merge-conflict-markers-in方法组合更改。如果存在低级文本合并驱动程序无法解决的冲突,Git将停止并获得帮助。

内置的二进制文件合并驱动程序只是声明失败。 Git会停下来寻求帮助。

如果您提供自己的合并驱动程序,则负责生成正确的合并结果和/或告知Git停止并获取帮助。因此,如果您有一个知道如何合并.png文件的合并驱动程序,您可以将其设置为*.png的低级合并驱动程序。


1
投票

据我所知,如果你尝试合并涉及两个PNG或其他二进制文件,你将受Git的合并冲突检测算法的支配。该算法通过文本文件中的变化来标记合并冲突,所述变化涉及彼此的特定接近度内的差异(例如,彼此的若干行内的变化)。

虽然您不可能在Git中使用二进制合并工具,但您可能必须执行Git的自定义构建/分支才能实现它。

但是,一般情况下,你应该避免在Git中对二进制文件进行版本控制,因为它不能很好地处理二进制内容。

© www.soinside.com 2019 - 2024. All rights reserved.