TFS:合并回主分支

Svi*_*ish 18 merge tfs branch

我们有一个Current分支,主要开发发生在那里.有一段时间,我一直在一个单独的分支中进行某种实验.换句话说,我将我需要的东西从Current分支分支到实验分支.在工作的同时,我经常将Current合并到实验中,以便我有其他人所做的更改,这样我就可以确定我的更改是如何工作的.

我现在想要合并回Current.首先,我将Current合并到实验中,编译并确保一切正常.所以在我的脑海中,实验和当前应该"同步".但是当我尝试将实验合并回Current时,我得到了一大堆冲突.但我认为当我将Current合并到实验中时,我已经解决了这些问题.

到底是怎么回事?我完全误解了什么吗?我怎样才能顺利完成这项工作?真的不想经历所有这些冲突......

Ric*_*erg 23

单击"解决单个冲突"时,摘要消息会显示什么?如果您从Current - > Experimental的合并完成而没有进行大量的手工操作,它应该是"X source,0 target,Y both,0 conflict".换句话说,目标(当前)文件中没有内容块不在源分支的副本中(实验).您可以安全地使用AutoMerge All按钮.

注意:无论如何,AutoMerge 应该是安全的.它被优化为保守的早期警告,而不是解决每个案例的能力.但我认识到,我们中的许多人 - 包括我自己 - 都喜欢在有任何问题时启动合并工具.在所描述的情景中,IMO,即使是最怯懦的人也可以轻松休息.


为什么会发生冲突?如果摘要信息那么简单和干燥怎么办?很高兴你问:)简短的回答 - 因为确定相关文件的共同祖先("基础")的计算很大程度上取决于它们之间的先前合并冲突是如何解决的.简单的例子:

  1. 设立两个分支,A和B.
  2. 在文件的不同部分编辑A\foo.cs和B\foo.cs
  3. 合并A - > B.
  4. AutoMerge冲突
  5. 合并B - > A.

TFS必须将此事件序列标记为冲突.B\foo.cs; 4和A\foo.cs; 2之间最接近的共同祖先一直在第1步,并且从那时起双方都发生了明显的变化.

很有可能在步骤4之后说A&B处于同步状态.(更准确地说:步骤5合并的共同祖先是版本#2).当然,成功的内容合并意味着B\foo.cs包含迄今为止所做的所有更改?不幸的是,有很多原因你不能假设:

  • 一般性:并非所有冲突都可以是AutoMerged.您需要适用于这两种方案的标准.

  • 正确性:即使AutoMerge成功,它也不总是生成有效的代码.当两个人将相同的字段添加到类定义的不同部分时,会出现一个典型的例子.

  • 灵活性:每个源控件用户都有自己喜欢的合并工具.并且他们需要能够在最初的Resolve决策["需要以某种方式某种方式合并内容"]和最终的Checkin ["here,this works"]之间继续开发/测试.

  • 架构:在像TFS这样的集中式系统中,除了自己的数据库+ API的验证要求外,服务器根本不能信任任何东西.只要输入符合规范,服务器就不应该尝试区分各种类型的内容合并是如何执行的.(如果您认为到目前为止的场景很容易区分,请考虑:如果AutoMerge引擎有错误怎么办?如果一个流氓客户端直接使用任意文件内容调用Web服务怎么办?这里只是表面上看......服务器必须持怀疑态度有一个原因!)所有可以安全计算的是你发给我一个与源或目标不匹配的结果文件.

将这些要求放在一起,您最终得出的设计将我们在步骤4中的操作归结为一个相当广泛的类别,其中还包括由重叠编辑,第三方工具提供的内容合并[自动或非自动]和文件手工合并而产生的手动合并事后编辑.在TFS术语中,这是AcceptMerge分辨率.一旦这样记录,合并规则(tm)必须承担最差的追求历史完整性和未来运营的安全性.在这个过程中,你对第4步的语义意图("完全融入B在#2中对A做出的每一次变化")都被愚蠢到几个字节的纯逻辑("给B以下新内容+信用处理# 2" ).虽然不幸,但它"只是"一个用户体验/教育问题.当合并规则做出错误的假设导致代码和数据丢失时,人们会更加愤怒.相比之下,您只需单击一个按钮即可.

FWIW,这个故事有许多其他结局.如果您在步骤4中选择了Copy From Source Branch [aka AcceptTheirs],则步骤5中不会发生冲突.如果您选择了AcceptMerge解决方案,但碰巧提交的文件与A\foo.cs具有相同的MD5哈希值,则同样如此; 2 .如果您选择Keep Target [aka AcceptYours],下游后果会再次发生变化,但我现在还记不清细节了.当您添加其他更改类型(尤其是重命名)时,上述所有内容都变得相当复杂,合并的分支与我的示例中的不同步,樱桃挑选某些版本范围并稍后处理孤儿等等....


编辑:由于命运会有,其他人只是在MSDN论坛上问了完全相同的问题.由于往往是我的本性,我写了另一个完全不同的长答案!(虽然明显触及相同的关键点)希望这有帮助:http://social.msdn.microsoft.com/Forums/en-US/tfsversioncontrol/thread/e567b8ed-fc66-4b2b-a330-7c7d3a93cf1a