TFS合并算法问题

时间:2012-06-06 12:48:00

标签: tfs merge tfs2010

我们使用TFS 2010并有三个分支:Dev - > QA - >生产

在这个特定的例子中,我们决定将方法参数类型和名称从“Guid reportGuid”更改为“int reportId”。我们在QA分支中进行了此更改并将其检入。现在我正在尝试将此更改从QA转移到Dev分支。通常它是在相反的方向完成,但在这种特殊情况下,我们做了我们所做的。 Here是合并工具的屏幕截图。从截图中可以看出,Dev分支中文件的最后一次登记获得了更改集号30282和QA-31002(比30282更新)。至于我,很明显,新的改变应该覆盖旧的改变。但TFS合并的做法恰恰相反。它将来自Dev分支(30282)的旧代码应用于来自QA分支(31002)的新代码,结果不会得到更改。

有人可以解释为什么TFS合并就是这样吗? 提前谢谢。

3 个答案:

答案 0 :(得分:8)

您正在发布三向合并工具的屏幕截图 - 我怀疑您将其归因于许多聪明人。 TFS使用任何3向合并工具进行冲突解决 - 默认情况下,它包括图中所示的工具,但您可以将其配置为使用any 3-way merge tool of your choice

当TFS检测到冲突时(在这种情况下,合并冲突,文件在两个分支中编辑然后合并),它将尝试automerge文件的内容。如果无法使用automerge,则需要使用配置的3向合并工具来解决冲突。 TFS简单地将该工具交给3个路径:“source”(作为合并源的分支中的文件),“target”(作为合并目标的分支中的文件)和“base”或common的祖先。

共同的祖先是在两个分支之间合并的文件的最后一个版本。如果没有执行合并,则共同的祖先是文件分支的变更集。在第一次将更改从源合并到目标之前,情况仍将如此。例如,假设$/Main/A.txt在变更集2处分支为$/Branch/A.txt。如果在$/Main/A.txt上进行了编辑(作为变更集3),则在$/Branch/A.txt上进行了编辑(作为变更集) 4)然后当您尝试将$/Branch合并到$/Main时,您将在A.txt上发生合并冲突。在这种情况下,共同的祖先将是变更集2(已分支的版本。)

如果您要在合并工具中解决该冲突并检入结果(作为变更集5),则下次从$/Branch合并到$/Main时,{的共同祖先是{ {1}}将是变更集5.(实际上,如果在TFS冲突解决期间调用“比较源到基础”或“比较目标与基础”,您应该能够看到共同的祖先及其版本信息。)

在任何情况下,一旦调用合并工具,最终工具的责任就是提示您处理这些更改。工作流程取决于工具,但典型的合并工具将逐行比较文件,并将每行标识为以下之一:

  • 不变:源头和目标中与祖先不变的行
  • 常见:已从共同祖先更改的行,但完全相同
  • 冲突:源和目标中都已更改且内容不同的行
  • 仅限来源:仅在来源中更改的行(目标与共同祖先相同)
  • 仅定位:仅在目标中更改的行(源与公共祖先相同)

如果存在 no 冲突的行,则可以执行“automerge”,这意味着通过从源获取仅源的行来修改共同的祖先,仅来自目标的行来自任一文件的目标和公共行以产生合并输出。 (如果可能的话,TFS会将此作为“automerge”选项提供。)

请注意,仅仅因为automerge是可能的(并且通常在实践中有效),它与获取行完全一样天真,并且不执行语法检查,因此可能是automerged output is not really what you want

某些3向合并工具可能会提供一种模式,在这种模式下,他们会执行部分自动注册 - 无论是在打开时还是在某些交互之后 - 采用常见的,仅限源和仅限目标的行,然后要求您解决手动冲突。

屏幕截图中的合并工具是Visual Studio ALM捆绑的默认工具。 TFS 2012中的工具显着改进了该版本。无论如何,您可以使用third-party merge tool获得更好的体验。

请注意,尽管有标签,合并工具实际上并不知道哪个文件是按时间顺序更新的。 (TFS为合并工具提供标签,为您提供有关这些文件的一些上下文,合并工具只是将它们视为不透明的字符串。)“新的时间顺序”也不一定是所有分支策略中最好的合并策略。 (我在一个使用特征分支策略的团队中工作 - 我的特征分支具有相对较高的速度,并且我合并了来自主分支的变化,该分支在相对较慢的节奏下从所有特征分支进行经过充分测试的变化。在这种情况下年表是相当不重要的,无论如何我都需要合并我的冲突。

答案 1 :(得分:3)

看起来这个屏幕截图上有合并冲突吗?

首先,不要使用visual studio / TFS的合并工具,它实际上没有效果,也不是非常直观。使用免费的KDiff3或Beyond Compare获得更好的自动合并和更友好的用户界面。

其次,据我所知,在TFS中没有合并的时间连贯性(我可能错了,但我从未听说过)。你提到的两个变更集不在同一个分支中,所以TFS不关心哪个变更集发生在另一个变量集之后,它意味着什么。

第三,合并的方向不会改变从branch1到branch2或branch2到branch1的任何内容。唯一改变的是两个分支是否直接相关。

对我来说,你的问题主要是基于GUI的,或者你可能使用了自动合并功能,在发生冲突时根本不聪明。

  1. 按照James Manning's post
  2. 更改合并工具
  3. 远离自动合并

答案 2 :(得分:3)

似乎TFS不支持间接集成,即从一个分支合并到另一个分支。你必须合并回父母,然后合并到你的其他分支(DEV)看到这篇文章:http://social.msdn.microsoft.com/forums/en-US/tfsversioncontrol/thread/85c4ce74-59bc-4bec-a6e9-32b6e875a15a/