这是在并行开发中,由于不正确的merge/branch操作,导致分支B中混进了分支A的代码,但是分支B需要在分支A之前发布到生产环境。本文记录了如何将分支A所引进的代码从分支B中移除。
问题描述
并行开发就是同一个项目有两个不同版本同时在开发。按照正常流程,每个版本都应该各自从主分支(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