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

Posted

技术标签:

【中文标题】是否有一种简单的方法可以在一个分支中创建补丁,然后将其应用于 TFS 2010 中的另一个分支?【英文标题】:Is there an easy way to create a patch in one branch and then apply it to another branch in TFS 2010? 【发布时间】:2012-01-11 22:27:21 【问题描述】:

我有两个服务包分支来自 TFS 2010 中的一个“主”分支。我想将更改集从一个服务包分支“传输”到另一个,而不通过主分支进行升级,也不需要进行毫无根据的合并。

“主”分支包含一个冲突的更改集,我不想与第一个服务包分支中的更改集合并。我希望第二个服务包分支以未修改的形式接收该更改集。

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

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

附:我不会改变分支结构来适应这种情况。整体结构比我描述的要复杂得多,它包含许多版本、服务包、子版本等。它遵循众所周知的分支指南。

【问题讨论】:

你能说明你的分支结构吗?一定要显示分支路径。 【参考方案1】:

所以你有这样的东西:

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

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

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

然后从A->B' 进行毫无根据的合并。之后进行合并B'->B。继续并销毁B'。虽然我从来没有这样做过,但它应该可以工作。

【讨论】:

我刚刚测试了这个。完美运行。 B 中的更改集包含所有历史记录,并且合并尽可能干净。即使在我完全删除(转换为文件夹并删除)B' 之后,我仍然可以在 B 中的变更集的历史记录中看到它。这就是我想要实现的。对于非 TFS 祝福的人来说,这也比其他答案更容易指导。【参考方案2】:

一种方法:

将两个分支(A 和 B)映射到 PC 上的单独文件夹中。 在 A 中找到要合并到 B 中的更改(查看分支的源代码控制历史记录,找到更改集并双击它们以列出已更改的文件),然后在目标分支中签出. (替代方案:检查所有文件 - TFS会在你签入时丢弃未更改的文件。或者拔下网线,然后运行VS,它会离线。合并后使用文件>源代码管理>上线重新上线和检查所有更改的文件) 使用合并工具(我推荐 Beyond Compare,Araxis,但除了 VS 附带的可怕工具之外的任何东西都应该这样做)将分支 A 中的每个文件合并到分支 B 中的等效文件 构建和测试分支 B 入住

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

另一种方法:

将变更集从 A 合并到您的主分支中。在合并期间,包含代码的 both 变体,并在新旧代码块周围添加 #if 命令,以便它们并排共存,并且通过简单的定义在主干线中“启用”了服务包。默认情况下不应定义此定义,因此主分支代码的二进制输出不受影响。即

#if SERVICE_PACK_A  
    ...ServicePackA code...  
#else  
    ...original Main branch code...  
#endif

现在将更改合并到分支 B

【讨论】:

我正在寻找可以进行更改但不是整个文件的内容。与 TFS 相关的东西【参考方案3】:

我的回答与 Jason Williams 的类似。如果您想留在“内部”TFS,那么您只有 2 个选项。进行baseless合并,或者从A合并到Main再从Main合并到B。

由于您不想执行其中任何一项操作,因此您需要在 TFS“外部”执行合并。

您需要的工具: Team Explorer,Team Foundation Power Tools,第 3 方合并工具。我喜欢 Sourcegear DiffMerge(因为它是免费的),但 Araxis、Beyond Compare 和 Winmerge 都可以正常工作。 (顺便说一句,你可以configure TFS to use a 3rd party merge tool(再次感谢杰森!))

    获取两个 Service Pack 分支的最新信息 查看目标分支 使用合并工具对两个本地文件夹进行文件夹比较 合并从 A 到 B 的适当更改 在命令行上对 B 的本地副本运行 tfpt uu,这将撤消在合并过程中未更改的所有文件的签出。 (这需要安装 TFS Power 工具。) 签入 B 中的未决更改

这不是很好,但我认为这是实现您想要实现的目标的唯一方法

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于是否有一种简单的方法可以在一个分支中创建补丁,然后将其应用于 TFS 2010 中的另一个分支?的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 中创建一个简单的表?

是否有一种编程方式可以在 Windows 中创建自定义网络配置文件并为其分配虚拟网络适配器?

有没有一种简单的方法可以在 C++ 中创建一个最小堆?

在 Management Studio 中创建 CHANGE 脚本?

Git 如何从特定的提交中创建一个新的分支

是否有一种明智的方法可以在分支之间合并 Visual Studio 项目文件(.csproj)?