如题,记录一个使用TortoiseSVN客户端合并时走得一个弯路
为了方便代码管理,我们在服务端通常会生成三个文件夹trunk,branches,tags分别为主干,分支,标签。
根据本人理解(如有不正确之处欢迎批评指正):
- trunk(主干)用于保存最新的代码,当然,如果一起开发的技术人员少的话也可以直接在trunk上开发,这样分支就没有什么用了。
- branches(分支):举个例子,当多个人合作,可能有这样的情况出现:John突然有个想法,跟原先的设计不太一致,可能是功能的添加或者日志格式的改进等等,总而言之,这个想法可能需要花一段时间来完成,而这个过程中,John的一些操作可能会影响Sally的工作,John从现有的状态单独出一个project的话,又不能及时得到Sally对已有代码做的修正,而且独立出来的话,John的尝试成功时,跟原来的合并也存在困难。这时最好的实践方法是使用branches。John建立一个自己的branch,然后在里面实验,必要的时候从Sally的trunk里取得更新,或者将自己的阶段成果汇集到trunk中。
- tag(标签):通常在最新版本上线后会从trunk里打一个标签,一是方便版本的管理,二是如果你发现以前某个已上线的版本出现一个bug时你就可以从tag里拿到相应版本的代码进行修改。因此在实现上,branches和tag,都是svn使用主干copy实现的。
如果还有不明白的点击看这里。
介绍以上三个知识后讲讲用svn进行合并时的注意点。当亲自实践完后,其实你发现从分支合并到主干需要注意三点:
一、保证你本地有trunk的最新代码,如果没有务必先checkout下来。并且你服务器上的branches的代码也是最新的;
二、在trunk的整个目录下执行merge,并从服务器上的相应的branches合并到本地的trunk;
三、再把本地trunk代码commit到服务器上。
没错,就是这简单的三步TM使我这菜鸟头疼了将近一天。最开始我直接想从服务器上相应的branches合并到trunk上,现在想想完全天方夜谭啊,老程序员说得永远不要在服务器上动代码或者各种文件就是真理啊。错误点二、我想从分支合并到主干,可是执行时却在本地branches的整个目录下进行merge,结果就是一大堆一大堆的conflict,还解决不了。到最后项目已经完全不知道是不是最新的了。最后把以前本地trunk(当时也不知道本地的主干是不是最新的了,真是笑哭)的所有文件(除了.svn)全部删除并commit,然后把备份好的最新分支代码整个手动复制粘贴到trunk上再提交,这是当时的应急之策,也是醉了。接下来再附上几张过程图:
这里再次强调想要合并到哪儿,就要到哪儿的本地文件夹上进行merge,这里合并到trunk
这里我都选第二种,第一种字面意思上是合并一定版本范围内的代码
这里又是一个注意点,和我们平常理解的意思相反,from是指要合并到的地方,我要合并到trunk这里就选服务器上trunk的地址,to选来源,即相应分支]
三步过后就能把branches里最新的代码merge到trunk上了,注意,此时SVN上的log日志没有记录(我也不明白为啥没有一个相应版本号来记录merge),然后再把合并后的本地trunk上的代码commit一下就完工了。
这里顺便记录一下创建分支,同样也是在trunk上的文件夹上右击选择branch/tag,然后To path选择branches下相应的应用版本的文件夹即可。
各路大神有不同意见的欢迎更正批评,希望初学者也不要走和我一样的弯路!!!