TFS - 在某分支中"移除"另一分支带来的代码
2012-09-07 14:36
411 查看
这是在并行开发中,由于不正确的merge/branch操作,导致分支B中混进了分支A的代码,但是分支B需要在分支A之前发布到生产环境。本文记录了如何将分支A所引进的代码从分支B中移除。
如下图,A版本和B版本都派生自PRD,互相独立,任一个先发布到生产环境都是没有问题的。
然而在实际操作中并没有严格按照此流程。当B开始的时候,A已经将近完成并且已经从DEV merge到了QA。笔者在这里犯了一个错误,直接从A版本的QA branch了一个DEV B分支做B版本的开发,这样DEV B中就混进了DEV A的代码。
此时不幸的消息传来,B版本需要在A版本之前发布。这意味着必须将A的代码从B中移除。
手动修改代码显然不具可操作性,这里描述的是如何通过TFS来操作。
操作中会多次使用到“回滚”(rollback)。在当前所使用的TFS版本中并没有单独的一个“回滚”的功能,但可以通过一个迂回的方式来实现。具体可以参照MSDN上的说明 How to: Roll Back a Changeset
从DEV B中移除DEV A的代码
将QA分支回滚到最初版本(QA 1),形成QA 3。这是将DEV A的代码从QA中移除,得到一个“干净”的版本。
将QA 3 merge到DEV B,形成DEV B 3。这是将DEV A的代码从DEV B中移除。
继续B的开发,开发完成后Merge到QA,形成QA 4,然后merge到Production,发布到产品环境。
至此B的开发,部署已经完成。
将DEV A 的代码重新提交到QA
由于此先已将DEV A的代码从QA中移除(QA2 –> QA3),所以需要重新提交。那么可以直接将DEV A3 merge到QA来重新提交吗? 尝试后发现并没有效果,原因是DEV A3已经曾经merge过到QA,TFS会将DEV A1~DEV A3标记成“已经提交”,所以后续再做merge不会提交任何改动。
最终的方案是使用两次回滚操作,如下
将DEV A分支回滚到最初版本(DEV A1),形成DEV A4。
将DEV A4 merge 到QA。
将DEV A分支重新回滚到最后改动的版本(DEV A3),形成DEV A5。
将DEV A5 merge 到QA。任务完成。
注意这里的实际作用是使DEV上有版本改动,从而使TFS识别改动并merge到QA。如下图
回滚操作 (DEV A3 => DEV A 4; DEV A4 => DEV A5; QA 2 => QA 3; DEV A4 => QA 5) : 所用冲突都使用本地版本(take local),即更早的版本
其他Merge操作: 自动或者手动Merge,两个分支的改动都需包含在内.
问题描述
并行开发就是同一个项目有两个不同版本同时在开发。按照正常流程,每个版本都应该各自从主分支(Production)中建立QA分支和DEV分支进行开发,互不干扰。如下图,A版本和B版本都派生自PRD,互相独立,任一个先发布到生产环境都是没有问题的。
然而在实际操作中并没有严格按照此流程。当B开始的时候,A已经将近完成并且已经从DEV merge到了QA。笔者在这里犯了一个错误,直接从A版本的QA branch了一个DEV B分支做B版本的开发,这样DEV B中就混进了DEV A的代码。
此时不幸的消息传来,B版本需要在A版本之前发布。这意味着必须将A的代码从B中移除。
解决方法
这里需要做两件事,一是将A代码从DEV B中移除,然后按照正常流程提交到QA和Production,二是因为之前移除了A的代码,所以需要重新将A的代码提交。手动修改代码显然不具可操作性,这里描述的是如何通过TFS来操作。
操作中会多次使用到“回滚”(rollback)。在当前所使用的TFS版本中并没有单独的一个“回滚”的功能,但可以通过一个迂回的方式来实现。具体可以参照MSDN上的说明 How to: Roll Back a Changeset
从DEV B中移除DEV A的代码
将QA分支回滚到最初版本(QA 1),形成QA 3。这是将DEV A的代码从QA中移除,得到一个“干净”的版本。
将QA 3 merge到DEV B,形成DEV B 3。这是将DEV A的代码从DEV B中移除。
继续B的开发,开发完成后Merge到QA,形成QA 4,然后merge到Production,发布到产品环境。
至此B的开发,部署已经完成。
将DEV A 的代码重新提交到QA
由于此先已将DEV A的代码从QA中移除(QA2 –> QA3),所以需要重新提交。那么可以直接将DEV A3 merge到QA来重新提交吗? 尝试后发现并没有效果,原因是DEV A3已经曾经merge过到QA,TFS会将DEV A1~DEV A3标记成“已经提交”,所以后续再做merge不会提交任何改动。
最终的方案是使用两次回滚操作,如下
将DEV A分支回滚到最初版本(DEV A1),形成DEV A4。
将DEV A4 merge 到QA。
将DEV A分支重新回滚到最后改动的版本(DEV A3),形成DEV A5。
将DEV A5 merge 到QA。任务完成。
注意这里的实际作用是使DEV上有版本改动,从而使TFS识别改动并merge到QA。如下图
冲突处理(Conflicts)
回滚步骤: 1. Get specified version; 2. Check out 整个文件夹; 3. 处理冲突; 4. Check in.回滚操作 (DEV A3 => DEV A 4; DEV A4 => DEV A5; QA 2 => QA 3; DEV A4 => QA 5) : 所用冲突都使用本地版本(take local),即更早的版本
其他Merge操作: 自动或者手动Merge,两个分支的改动都需包含在内.
题外话:HTML5 Canvas
上述版本树(Version Tree)使用HTML5 canvas画出来的。源代码在此:TFSVersionTree.rar相关文章推荐
- TFS使用笔记——合并不同分支的代码
- vim格式化代码实际上就是 "缩进代码", 命令是等号=
- 【前端】点击单选框radio,复选框checkbox, 增加与移除父级父级的"active" 样式
- 关于【finder不能完成该操作 因为未能读取或写入"文件名"中的某些数据(错误代码-36)】快速解决办法
- 在Android Studio 和 Eclipse 的 git 插件操作 "代码提交"以及"代码冲突"
- VS2010中C#代码用"转到定义"或F12转到定义时,总是显示从元数据的问题
- 旧代码中的"enum hack"
- C++ - 标准库 "merge" 函数 的 用法及代码
- "LC.exe"已退出,代码为-1。项目为 Shell
- OC中的一些编程写法--({"添加代码"})
- 文件夹右键菜单添加"快速共享"及bat代码
- 解决解密时出现"要解密的数据的长度无效" 或 "填充无效无法被移除" 的错误
- VS2005 发布网站出现 "aspnet_merge.exe已退出,代码为1"的错误解决方法
- VS2010编译时拿老版本的代码运行,出现"source code is different..."解决办法
- Eclipse代码补全,修改 空格键 "=" 键不上屏
- Android中热修复框架Robust原理解析+并将框架代码从"闭源"变成"开源"(上篇)
- "第二行代码"知识总结——整体概述
- C++ - 标准库 "merge" 函数 的 用法及代码
- "abc"已经被创建并保存于字符串池中,因此JAVA虚拟机只会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在栈中创建的三个char型值值'a'、'b'和'c'
- PHP "完美"的防XSS 防SQL注入的代码