在 TFS 中查找合并候选项

Finding merge candidates in TFS

我的代码有两个分支。让我们说 B1B2。代码更改同时发生在两个分支上,我们从 B1B2 进行定期合并(不是所有,只有必要的事情)。但是,此合并是通过将代码从一个分支复制粘贴到另一个分支来手动完成的(无论出于何种原因)。现在,我想确保所有必要的东西都从 B1 合并到 B2。请注意 B2 分支中的文件可能包含来自 B1 以外的其他更改。我尝试使用 tfs merge /candidates ... 命令希望它能进行文件比较(可能使用 diff 工具)并给出输出,但这不起作用。只有当我使用 tfs merge 命令时,它才会记录合并。如果手动合并文件,是否有任何简单的解决方案可以消除误报?

你可以做一个 discard merge. This has to be done from the command line. Open up the Developer command prompt, then navigate to a folder under either of your branches (i.e. navigate to one of the affected workspaces)。然后输入:

tf merge /r /discard "$/Project/B1" "$/Project/B2" /v:C12345~C12345

这将获取已识别的变更集(在本例中为变更集 #12345),并将其更新为合并到目标分支(分支 B2)。目标文件将被签出,但不会更改 - 您只需签入即可完成操作。之后,变更集将不再显示为合并候选者。您可以指定要同时合并的变更集范围,但它们应该是连续的。

请注意,在执行此操作后,变更集有时仍会显示为合并候选者 - 这在最新版本的 TFS 中并不常见,而且几乎不可能修复(除非您是 运行 您的拥有本地安装的 TFS 并希望亲自动手处理数据库)。如果您最终遇到这些孤立的变更集之一,请忽略它。

TFS 在合并和帮助您解决合并冲突方面做得非常出色。唯一一次你想 "merge" 以你现在的方式手动操作是当你有很多自动生成的代码(这会在合并时产生很多难以解决的冲突)或者你有二进制文件。

手动合并在一定程度上违背了源码控制的原则。强烈建议您使用tf merge 命令Source Control Merge Wizard 通过VS 来实现合并。您可以合并变更集版本、日期版本、标签版本,甚至是工作区版本。如果你使用了命令,一切都会很容易。正如您提到的最简单的解决方案,使用 tfs merge /candidates 将打印源中尚未合并到目标中的所有变更集的列表。您只需要检查是否已将所有必要的东西合并到 Branch2。

如果您坚持手动合并,唯一可能消除误报的方法是比较合并后的文件、文件夹或分支。您可以在 VS 中使用 比较文件夹 或使用此扩展 TFS Productivity Pack (Visual Studio 2015)

进行快速比较(只需单击鼠标两次)

我认为这种情况没有任何简单的解决方案。在您提到的合并仅必要的东西的问题中,是否可以合并 B1 -> B2 中的所有内容?如果是,请继续阅读:

  1. 如果 B2 中的附加更改很少,首先创建在 B2 分支中修改的文件列表(不属于 B1 的附加代码)。从 B1(比如 B2_new)创建一个新分支,checkout/edit 根据上面列表准备的 B2_new 分支中的文件。 (在签入期间,您可能需要解决冲突。)但这会创建一个新的基线,现在您知道 B1 中的所有内容现在都出现在 B2_new 中。 Discard/lock B2 分支并使用 B2_new 前进。

  2. 如果 B2 中的更改非常重要,以至于需要大量手动编辑才能将其移动到 B2_new,那么我会接受它并从B1 到 B2(完整分支或仅您需要的文件夹)。是的,即使对于您已经手动合并的文件,这也会显示大量冲突。但是要在 TFS 中创建合并关系,您必须这样做。那将是一个非常糟糕的合并。

就我个人而言,如果 B2 的变化很小,我更喜欢选项 1,因为它更干净,您将得到一个全新的工作状态。希望对您有所帮助。