2

我们使用 TFS 2010 并拥有三个分支:Dev -> QA -> Production。

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

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

4

3 回答 3

8

您正在发布 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),那么下次您从$/Branchto合并时$/Main,共同祖先A.txt将是变更集 5。(实际上,如果您调用“比较源在 TFS 冲突解决过程中 to base”或“compare target to base”,您应该能够看到共同的祖先及其版本信息。)

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

  • Unchanged:源代码和目标代码中未更改的行
  • Common:从共同祖先改变的行,但同样如此
  • 冲突:在源和目标中都已更改且内容不同的行
  • 仅源:仅在源中更改的行(目标与共同祖先相同)
  • 仅目标:仅在目标中更改的行(源与共同祖先相同)

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

请注意,仅仅因为自动合并是可能的(并且通常在实践中有效),它就像取行一样天真并且不执行语法检查,因此您的自动合并输出可能不是您真正想要的。

一些 3 路合并工具可能会提供一种模式,在这种模式下它们会进行部分自动合并——默认情况下在打开时或在某些交互之后——采用通用、仅源和仅目标行,然后要求您手动解决冲突。

屏幕截图中的合并工具是与 Visual Studio ALM 捆绑的默认工具。TFS 2012 中的工具比该版本显着改进。无论如何,使用第三方合并工具可能会有更好的体验。

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

于 2012-06-06T16:11:19.663 回答
3

看起来您在此屏幕截图上遇到了合并冲突,对吧?

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

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

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

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

  1. 按照James Manning 的帖子更改您的合并工具
  2. 远离自动合并
于 2012-06-06T16:05:22.367 回答
3

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

于 2012-12-07T01:25:59.900 回答