【问题标题】:TFS How does merging work?TFS 合并是如何工作的?
【发布时间】:2011-06-27 03:00:20
【问题描述】:

我有一个发布分支 (RB,从 C5 开始)trunk (C10) 上的一个变更集,我现在想合并到 RB 上。

该文件在 C3 处有更改(两者共有),一处在 RB 上的 CS 7 处,一处在 C9(主干)处,一处在 C10 处)。因此,我更改文件的历史记录如下所示:

    RB:       C5 -> C7
Trunk: C3 ->             C9 -> C10

当我将 C10 从主干合并到 RB 时,我希望看到一个合并窗口显示我 C10 | C3 | C7 因为 C3 是共同祖先修订版,而 C10 和 C7 分别是我的两个分支的提示。但是,我的合并工具显示C10 | C9 | C7

我的合并工具配置为显示 %1(OriginalFile)|%3(BaseFile)|%2(Modified File),因此这告诉我 TFS 选择了 C9 作为基础修订版。

这完全出乎意料,并且与我习惯于在 Mercurial 或 Git 中工作的合并方式完全相反。是我做错了什么还是 TFS 试图通过合并让我发疯?

这是默认的 TFS 合并行为吗?如果是这样,您能否提供他们为何选择以这种方式实施的原因?

我使用 TFS 2008 和 VS2010 作为客户端。

【问题讨论】:

  • 如果你使用标准的合并工具会发生什么(所以删除配置的用户工具)?
  • @Ewald Hofman:这是一回事(除了默认的 TFS 合并实用程序是废话),因此它与正在使用的合并工具明确无关。
  • @Ewald:这会让你(或其他任何人)能够回答我的问题吗?
  • @John:TFS 2008。将它与 Visual Studio 2010 一起使用。

标签: tfs merge branching-and-merging


【解决方案1】:

我在 TFS 分支和合并(我们有 dev、integration 和 main 分支)方面遇到了一些类似的初始挣扎。

短版本是你不能直接从一个提示合并回一个共同的祖先。

因此,如果 C3 分支到 C5,然后 C7 分支到 C9,那么该工具提供的内容在 TFS 工作方式的上下文中是有意义的。您基本上需要从 C10/C9 到 C7,然后从 C7 到 C3。

用一个更具体的例子换一种说法,下面是我们在项目中处理多级分支和合并的方式。

我们从主干/主干开始。

然后我们分支到集成分支。

然后我们(这是关键)从集成分支到我们的各个开发分支,以便我们可以处理即将发布的版本。

随着开发分支中的更改完成,我们首先通过从集成合并到我们的开发分支进行反向集成(因此我们会获取其他所有人的更改)。然后,我们通过从我们的个人开发分支转到共享集成分支来进行前向集成。

一旦集成通过了 QA,我们就会通过将主干合并到集成进行反向集成(以防万一 main 中有任何修补程序),然后将集成中的所有组合更改前向集成到 main。

在发布日,我们将最后一个分支从 main 分支到一个新的发布分支,然后进行部署。

基本上,在 TFS 中,您始终必须在分支/合并树上上下移动,从树干到树枝再到树枝再到叶子 - 您不能在任何时候绕过分支层次结构中的任何步骤。

比喻地说,TFS 分支和合并更像是树懒爬上一棵树,然后慢慢地爬到一个分支的末端,而不是失去它的抓地力,而不是一只猴子在分支之间跳跃;)

需要一点时间来适应,但一旦完成(尤其是当您习惯了正向集成/反向集成范式后),它会很有效,尤其是当您有几个人都在做开发并且您需要打包时在不拖泥带水的情况下完成每个人的更改。

希望有帮助!

【讨论】:

  • @Bob Palmer:感谢您的回答。我知道 RI/FI 模式。然而,这并不能解释为什么 TFS 选择 C9 作为基础版本。我认为您可能误解了我展示的示例。 C5 和 C7 是对我的发布分支上的文件的更改(C5 标志着发布分支的开始,C7 是对发布分支上提交的文件的更改)。
  • 啊,现在我更理解你的例子了!我怀疑您将 C9 视为您的基础而不是 C3 的原因是因为您在 C5 处分支,因此看起来它正在获取第一个提交的基础分支后(即 C9)。我将在我的一台 TFS 服务器上对此进行测试。
  • hmm... 我去制作了一个示例文件,开始并复制了上面的场景 - 当我去进行第二次更改(你的 C10)时,我看到了我的原始文件(你的 C3)作为我的基础,而不是我的 C9 等效更改...所以肯定还有其他东西。为了我自己的利益-您从trunk开始,然后在Changeset 3之后分支到RB,而Changeset 5代表第一次签入RB?
  • 是的,我从主干开始,然后在变更集 3 之后分支到 RB(这创建了 C5)。
  • 在 TFS 中进行分支和合并是一个残酷的情妇……在此过程中,某些东西一定已经重置到它认为基础所在的位置,并且失去了与 C3 的连接 - 我可以得到你想要的行为,但随后我有复制(在实验室条件下)你上面的树的好处。
【解决方案2】:

我之前浏览过这个网站并偶然发现了这个页面,这有帮助吗?

How to branch and merge in TFS

【讨论】:

  • 抱歉,Jaanus,这并不完全有帮助。
【解决方案3】:

我认为您可能有错误的合并方法,因为您所描述的完全有可能,并且对我有用。但是您始终必须记住,当您开始从主分支分支时,要进行适当的 RI(反向积分)和 FI(正向积分)。搜索codeplex for branching guidelines and best practices

本质上,任何退回到主分支的更改都必须在合并回来之前返回到您的其他分支。这是最佳实践,每次都有效,之后,您可以继续从分支回到主干进行 FI。

【讨论】:

    猜你喜欢
    • 2012-04-14
    • 2011-05-27
    • 2012-09-23
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2016-12-31
    相关资源
    最近更新 更多