您正在发布 3-way 合并工具的屏幕截图 - 我怀疑您将许多智能归因于它。TFS 使用任何 3 路合并工具来解决冲突 - 默认情况下,它包括图中的那个,但是您可以将其配置为使用您选择的任何 3 路合并工具。
当 TFS 检测到冲突时(在这种情况下,合并冲突,文件在两个分支中都被编辑然后合并),它将尝试自动合并文件的内容。如果无法自动合并,则需要您使用配置的 3 路合并工具来解决冲突。TFS 只需将该工具提供 3 个路径:“source”(分支中的文件,即合并的源)、“target”(分支中的文件,即合并的目标)和“base”或 common祖先。
共同祖先是在两个分支之间合并的文件的最后一个版本。如果没有执行合并,则共同祖先是文件分支所在的变更集。在您第一次将更改从源合并到目标之前,情况将一直如此。例如,考虑$/Main/A.txt
分支到$/Branch/A.txt
变更集 2。如果在$/Main/A.txt
(作为变更集 3)上发生编辑,并且在$/Branch/A.txt
(作为变更集 4)上发生编辑,那么当您尝试合并$/Branch
到 时$/Main
,您将在 上发生合并冲突A.txt
。在这种情况下,共同祖先将是变更集 2(分支的版本。)
如果您要在合并工具中解决该冲突并签入结果(作为变更集 5),那么下次您从$/Branch
to合并时$/Main
,共同祖先A.txt
将是变更集 5。(实际上,如果您调用“比较源在 TFS 冲突解决过程中 to base”或“compare target to base”,您应该能够看到共同的祖先及其版本信息。)
在任何情况下,一旦调用了合并工具,最终将由该工具负责提示您处理这些更改。工作流程依赖于工具,但典型的合并工具将逐行比较文件并将每一行标识为以下之一:
- Unchanged:源代码和目标代码中未更改的行
- Common:从共同祖先改变的行,但同样如此
- 冲突:在源和目标中都已更改且内容不同的行
- 仅源:仅在源中更改的行(目标与共同祖先相同)
- 仅目标:仅在目标中更改的行(源与共同祖先相同)
如果不存在冲突的行,则可以执行“自动合并”,这意味着通过从源中获取仅源行,从目标中获取仅目标行以及来自任一文件的公共行来修改共同祖先产生合并输出。(如果可能,TFS 将把它作为“自动合并”选项提供。)
请注意,仅仅因为自动合并是可能的(并且通常在实践中有效),它就像取行一样天真并且不执行语法检查,因此您的自动合并输出可能不是您真正想要的。
一些 3 路合并工具可能会提供一种模式,在这种模式下它们会进行部分自动合并——默认情况下在打开时或在某些交互之后——采用通用、仅源和仅目标行,然后要求您手动解决冲突。
屏幕截图中的合并工具是与 Visual Studio ALM 捆绑的默认工具。TFS 2012 中的工具比该版本显着改进。无论如何,使用第三方合并工具可能会有更好的体验。
请注意,尽管有标签,但合并工具实际上并不知道哪个文件按时间顺序更新。(TFS 为合并工具提供标签以提供有关这些文件的一些上下文,合并工具只是将它们视为不透明的字符串。)“按时间顺序更新”也不一定是所有分支策略中的最佳合并策略。(我在一个使用特性分支策略的团队中工作 - 我的特性分支具有相对较高的速度,我合并来自主分支的更改,该分支以相对较慢的节奏从所有特性分支中获取经过良好测试的更改。在这种情况下,年表相当不重要,无论如何我都需要合并我的冲突。