在TFS 2010中,有没有一种简单的方法可以在一个分支中创建补丁,然后将其应用于另一个分支



我有两个service pack分支,它们来自TFS 2010中的一个"main"分支。我想将更改集从一个service pack分支"传输"到另一个,而不通过主分支进行升级,也不进行毫无根据的合并。

"main"分支包含冲突的更改集,我不想将其与第一个service pack分支中的更改集合并。我希望第二个service pack分支以未修改的形式接收更改集。

无基线合并将在两个分支之间创建一个链接。我不希望这样的链接出现在合并对话框中。

有没有一种简单的方法可以在一个分支中创建补丁,然后将其应用到另一个分支?类似于Subversion。

附言:我不会改变分支结构来适应这个场景。总体结构比我所描述的要复杂得多,它容纳了许多发布、service Pack、子相关等。它遵循众所周知的分支准则。

所以你有这样的东西:

------------------------------------> MAIN
                
                 
        A          B

你可以从B:中创建一个B'分支

------------------------------------> MAIN
                
                 
        A          B
                    
                     
                       B'

然后从A->B'进行无基础合并。然后进行合并B'->B。继续&销毁CCD_ 3。虽然我从来没有这样做过,但它应该有效。

一种方法:

  • 将两个分支(A和B)分别映射到电脑上的文件夹中
  • 在A中找到要合并到B中的更改(查看分支的源代码管理历史记录,找到更改集并双击它们以列出更改后的文件),然后在目标分支中将它们签出。(备选方案:签出所有文件-TFS将在您签入时丢弃未更改的文件。或者拔下网络电缆,然后运行VS,它将脱机。合并后,请使用"文件">"源代码管理">"联机"返回联机并签出任何更改的文件)
  • 使用合并工具(我建议使用Beyond Compare、Araxis,但除了VS附带的糟糕文件之外,其他任何工具都可以)将分支a中的每个文件合并到分支B中的等效文件
  • 建立并测试分支B
  • 办理登机手续

这避免了使用TFS进行任何合并,因此它不会知道这是一个合并。它只会认为你在分支B中写了很多代码,速度相当快:-)

另一种方法:

  • 将变更集从A合并到主分支中。在合并过程中,包括两个代码变体,并在新代码块和旧代码块周围添加#if命令,以便它们并排共存,并且通过简单的定义在主干中"启用"service pack。默认情况下,不应定义此定义,因此主分支代码的二进制输出不受影响。即

    #if SERVICE_PACK_A  
        ...ServicePackA code...  
    #else  
        ...original Main branch code...  
    #endif
    
  • 现在将更改合并到分支B

我的答案与Jason Williams的相似。如果你想留在"内部"TFS,那么你只有两个选择。执行无基线合并,或从A合并到Main,然后从Main合并到B.

由于您不想执行这两种操作,因此需要在TFS的"外部"执行合并。

您需要的工具:团队资源管理器,Team Foundation Power Tools,第三方合并工具。我喜欢Sourcegear DiffMerge(因为它是免费的),但Araxis、Beyond Compare和Winmerge都可以。(顺便说一句,你可以将TFS配置为使用第三方合并工具(再次感谢Jason!))

  1. 获取两个service pack分支的最新信息
  2. 查看目标分支
  3. 使用合并工具在两个本地文件夹之间进行文件夹比较
  4. 将适当的更改从A合并到B
  5. 在命令行上,对B的本地副本运行tfpt uu,这将撤消作为合并一部分未更改的任何文件的签出。(这需要安装TFS Power工具。)
  6. 签入B中挂起的更改

这不太好,但我认为这是实现的唯一方法

实际上,有人向我介绍了另一个我也喜欢的解决方案。http://geekswithblogs.net/TarunArora/archive/2011/06/06/unshelve-shelveset-created-from-one-branch-to-another.aspx

最新更新