当我使用Visual Studio 2015的合并工具修复冲突时,似乎它比使用P4Merge与GIT命令行(它几乎没有发现任何冲突)表现更差。 / p>
这是因为工具本身吗? Visual Studio 2015的合并/差异工具是否为GIT提供了3向合并?
答案 0 :(得分:3)
TL; DR :Visual Studio在合并Git存储库和尝试解决出现的冲突时都会进行三向合并。目前还不清楚为什么VS在解决冲突时不如P4Merge,但不知道其他任何事情,我怀疑P4Merge在inconsistent line ending configurations方面更好。
合并过程有两个阶段:首先,执行合并并生成一个组合树,其中包括来自两个分支和(可能)冲突的新变化,其次是冲突解决阶段。
在Visual Studio中,第一个阶段是常规git合并,这确实是一个三向合并。 "合并基地"找到,这是两个分支中存在的最后一次提交;这是您的两个分支最后一次合并,或者是另一个分支创建的点。
然后通过确定每个分支中哪些文件已更改,将它们与共同祖先进行比较,在树级别执行三向合并。如果文件在一个分支中已更改,则该分支的更改将包含在新树中。如果两个分支中的文件已更改,那么我们需要在文件级别进行三向合并,这非常相似,并将每个分支中的文件与它们的文件进行比较共同祖先。现在,如果文件的任何区域在一个分支中相对于共同祖先发生了变化,那么我们将在合并文件中包含该变更区域。但如果两个分支都改变了同一个区域,那么就会产生冲突。
Git会在工作目录中生成一个带有冲突标记的文件,但它也会记录这两个文件及其共同的祖先,以便您可以使用合并工具(如Visual Studio或P4Merge)。
(请注意,当您使用Visual Studio执行合并时,它使用libgit2库,尽管it produces the same results为Git本身。)
一旦出现合并冲突,您的合并工具就可以获取这三个文件,并为您提供解决冲突的图形体验。通常,每个工具的第一步是尝试再次进行文件级合并,并将创建一个新的"结果"文件(通常显示在三个窗格的中间窗格中,两边有两个分支,或者不常见于两个分支文件的上方或下方)。
此结果通常包括未自动合并的任何区域,并且UI通常会提示您解决无法自动充电的重叠区域。一般来说,我的经验是,这里没有很多差异,但肯定会有变化。特别是:
有些工具可能会更加积极地加入彼此靠近的小型冲突,这可能会带来更少但更大的冲突,这些冲突可能更容易解决 - 例如,如果您有多个冲突是一个 - 每一行都可能更好地将它们压成一个更大的冲突。
有些工具可能会对转换进行编码,因此您可以正确合并一个祖先的UTF-8文件,一个分支中的UTF-16和另一个分支中的Latin1,并在一个分支中获得智能输出那些编码(或者甚至是完全不同的编码)。
某些工具可能会忽略空白更改。我预感到这可能是您在Visual Studio和P4Merge之间看到差异的地方;众所周知,行结束配置很难在Windows Git客户端的整个团队中进行设置。简单地忽略行结尾差异的合并工具可以产生很多更好的体验,而不是没有。
你甚至可以使用理解文档结构的工具:例如,合并两个XML文件通常不会尝试理解XML的结构,但是{{3避免像空白变化那样对文件含义不重要的事情。