如何将 TFS 变更集从分支 A 合并到分支 C。分支 A 已合并到分支 B,并且 A 和 C 之间没有合并关系

How to merge TFS changeset from branch A to branch C. Branch A was merged into branch B and there's no merge realationship between A and C

假设有 3 个 TFS 分支 - A、B 和 C。 您可以将变更集从 A 合并到 B,从 B 合并到 C。但不能将变更从 A 合并到 C。 A -> B -> C。 我需要将分支 A 中的一些变更集合并到分支 C 中。 所有变更集(来自所有用户)已经从 A 合并到 B。

当我尝试从 B 合并到 C 时,它没有提供我从 A 更改集的列表(只是一个包含一段时间内所有更改的大更改集。) 当我尝试将我的特定更改集从 A 合并到 B 时,我也看不到它们,因为它们已经是分支 B 的一部分。

有没有一种聪明的方法可以将我从 A 或 B 中选择的更改合并到 C 中,并且不破坏任何未来的合并。

谢谢。

您所描述的称为无基础合并。尽管您可以执行它们,但不建议这样做,并且几乎总是表明您的分支策略存在问题。

您可以使用 tf 命令行工具执行无基础合并。我不相信这在 Visual Studio IDE 内是可能的,尽管我可能是错的,因为自从我不得不执行无基础的合并以来已经有很多年了。

我强烈建议评估在您的工作流程中发生的事情,这些事情让您处于需要执行无基础合并的情况。可能是你的分支策略不合适,也可能是你的工作流程更适合另一个 VCS,比如 Git.

不可能实现A -> B -> C 合并并保留所有历史记录。 Branching/move 会 丢失文件夹历史记录 ,但单个文件历史记录实际上并没有丢失。它隐藏在文件历史记录行最左侧的 "expand me" 小箭头下。在文件的最旧历史记录条目或任何您看到它的地方展开它,您将从不再存在的旧位置看到该单个文件的历史记录。

但是,如您所见,合并变更集的分支是基于文件夹历史记录。例如Branch B的第一个变更集将是变更集XXX分支来自 BranchA.

您将无法 select BranchA

的旧变更集

解决方案

一种实现您需要的方法是直接将 BranchA 与旧变更集合并到 Branch C 即使您会收到如下警告提示:

A merge relationship does not exist between the source and the target. A baseless merge will be performed.

您需要do a baseless merge cmd 中的目标分支。

tf merge /baseless <<source path>> <<target path>> /recursive