2013-08-12 53 views
1

我们有一个名为“Main”的分支。 2012年7月,我为我们项目的下一个版本创建了一个新的分支机构,名为“阶段3”。自那时起我们一直在努力,但不时有其他更改会应用于Main。与TFS 2012合并试图通过已经合并的更改

今年5月,我们进行了从主到第三阶段的合并,并进行了一些更改,这一切都很好。

在当时和现在之间,我们将TFS服务器从2008年升级到2012年更新3.(我没有参与“升级”,但我相信它是在具有某种备份/恢复的新服务器上安装的的数据。)我们已经有一些与此有关的其他问题。

上周我试图执行从主到第三阶段的另一个合并。我选择了“选定的变更集”,因为我们在第三阶段的分支做了大量的返工工作,所以合并变更非常困难 - 所以我想一点一点地做他们。

但是,我很惊讶地发现Visual Studio试图合并跨越2011年7月 - 分支之前的一个好年份(实际上是对我们项目的这部分进行的第一次修改)。

奇怪的是,如果我查看阶段3解决方案的历史记录,我可以扩展它并查看所有这些更改。所以TFS似乎知道他们已经应用了。

我试图合并一些早期的变化,看看会发生什么。其中包含的唯一更改是与已重命名或删除的项目有关。例如,我们重命名了我们的解决方案,因此TFS想要将SLN的副本与旧名称分支并合并。或者我们有一些图像在两个分支中都被删除,但在这次新合并时没有。

所以我支持这一点,并试图从今年5月份开始合并所有内容 - 即在我们上次合并之前。这带来了一系列可怕的变化 - 各种各样的事情,包括常规合并/编辑类型的变化。所以我也支持了!

我们已经从阶段3创建了另一个分支。我已经能够在两个分支之间进行合并了。我认为它是在TFS升级前一周左右创建的。但它没有遇到这个问题。

我们还有其他来自Main的分支。这些正在经历这个问题,因为TFS想要应用它已经做出的改变。

我正在使用VS2012更新3来进行合并。我也尝试过VS2010以防万一,但是这样做。同事也尝试过并证实了相同的症状。

我不认为这有助于我们的第三阶段与主要阶段大不相同,因此合并任何事情都非常困难。

有谁知道我该如何最好地解决这个问题?我有点担心做一些我可能后悔的事情!

+1

这不是一个答案,但在TFS中合并和分支是一个巨大的问题,随着时间的推移,你只会遇到更多的问题。避免这些问题的最佳建议实际上是从TFS转向使用竞争的VCS工具。 –

+0

对于我们来说,目前这不是一个真正的选择,因为组织现在已经投入太多TFS。我们多年来一直在使用TFS来源,并且在此之前从未真正有任何问题。 (嗯,我们还没有能够忍受。) – John

+0

MS有一个原因是为了实现git作为他们的TFS SCM引擎的一个选项,尽管它不是'真正的'git,有一些妥协来适应它采用TFS方式集中存储。拥抱...... :) – gbjbaanb

回答

4

从TFS 2008升级到TFS 2010时遇到类似的问题。该问题可能是由于部分合并的变更集。即变更集中的一些文件已合并,有些则没有。或者它可能是一个分支移动/重命名的情况。请参阅回答here以获取有关分支重命名可能导致此问题的原因的详细信息。

在TFS 2008中,如果尝试合并,则会从挂起更改列表中取消选中文件。TFS假定你不想再次合并文件,并且在后续合并时你不会看到这些文件。

在TFS 2010或更高版本中,行为会发生变化。如果您从挂起的更改中取消选中文件,则在下一次合并时,TFS将尝试再次合并这些文件。我认为TFS201x具有正确的行为,但是它没有强调行为改变的痛苦。

要检查如果是这样的情况下,运行在命令行下面

tf merge $/tp/main $/tp/phase3 /recursive /candidate

/candidate开关告诉TFS给你就是了,而不进行合并来合并变更集的列表。如果您在列表中看到其旁边有*的任何变更集,则会将这些变更集合部分合并。

要解决它,你有2个选择。

  1. 合并文件和解决冲突,它可能是值得的合并通过变更基础上变更,而不是试图做一次全部。这可能会有点痛苦,但一旦完成就完成了。

  2. 如果您确信phase 3分支是正确的,则可以使用命令提示符进行合并。如果使用tf merge $/tp/main $/tp/phase3 /version:c123~c456 /recursive /discard,其中c123代表要忽略的最旧变更集,而c456代表要忽略的最近变更集。 /discard开关告诉TFS更新合并历史记录,以便它认为合并已完成,但它实际上不会执行合并。这应该从你的候选人

的列表中删除部分合并的变更如果您选择选项2,那么你应该做一些分析,以确保你真的不希望采取部分合并的变更。

+0

是的,我确实收到很多带*的变更集,所以我认为您可能是对的。我知道一些事实肯定不应该合并到阶段3中(例如在阶段3分支之前创建的),所以听起来像选项2将能够清除所有这些。我认为结合这两种选择我应该能够解决它。非常感谢你的帮助 - 你是一个拯救生命的人! – John

+0

没问题,我在这里发布的主要原因之一是因为我经历了痛苦。 TFS已经成熟到相当不错的产品,但需要一段时间才能到达那里 –

0

如果您认为合并过于困难,或者您不信任它,那么唯一可行的选择是“用新变更集重写它”。即 - 在TFS之外手动进行合并,然后提交新的固定变更集。然后,杀死旧分支并重新开始。

不是一个理想的情况,但你的源代码完整性是最重要的。希望从新的分支开始可以避免将来出现这样的问题。