刚看到有同学遇到这方面的问题,于是把自己以前看的总结一下,虽然一直用着!!
创建分支的意义:
简单说,分支就是用于区分开发版本与当前发布版本的。
1、 主干负责新功能的开发
2.、分支负责修正当前发布版本的bug(对于可以放入下个发布版本的改进性bug可以直接在主干上开发)
3.、分支上修改的bug,经常性merge到主干上,尽量及时merge(避免大面积红色区域)。
4.、只能分支往主干靠拢(merge),不能反向!
5.、直到下个新版本发布,该分支停止修改
1、svn 创建分支:
svn copy trunk_path branch_path -m ‘描述’
Svn的分支和标签操作都是复制一份副本。可能有人觉得,如果创建太多分支的话,不停的复制,服务器会不会太多东西了,负荷太重了,这个大可放心,svn的复制操作并不是真正的复制一份同样的数据,而是一个“钱复制”,它只是创建了一个链接而已,一个到主干的 连接。在你对分支没做任何修改之前,分支都只是一个链接,当你对分支的文件作了修改后,该文件在分支那才会真正的创建一个文件。如下代码,我在我的google code上面创建了一个我自己项目的分支
svn copy https://simaopig.googlecode.com/svn/trunk https://simaopig.googlecode.com/svn/branches/20091022 -m ‘a new branches’
提交后的修订版为 21。
2、svn 查看创建分支时的版本号:
大家在上面的例子中看到了我的创建分支时的版本号为21。可是当我把分支里的内容改过,或者trunk的内容被别人改过后。就凭咱这脑袋是打死也不会记得这个创建分支时的版本号的。这可就成问题了,不知道合并哪些版本了。。
![svn info查看最新版本 svn info查看最新版本](http://farm3.static.flickr.com/2655/4033773309_dcef6f4d11.jpg)
svn info查看最新版本
看现在的版本号变成23了,这才几分钟。如果时间长了的话。我真的会不记得这个创建分支时的版本号的。咋办呢?
svn log –verbose –stop-on-copy branch_path
看我执行该命令后的结果:
![svn log --verbose --stop-on-copy svn log --verbose --stop-on-copy](http://farm3.static.flickr.com/2506/4033777543_9dbc5a608c.jpg)
看到没,在最后一行,显示的那个版本号就是你创建该分支时的版本号。 stop on copy 多么形象啊。赞一个。
3、svn 合并分支:
内容改完了,要上线了。我们应该把分支的内容与trunk上的内容合并。咋合并呢?
#进入有trunk版本的目录中,也就是在主干目录把修改过的分支的代码合并过来
svn merge -r 旧的版本号:现在的版本号 branch_path
![svn merge svn merge](http://farm3.static.flickr.com/2733/4034539794_21aafaa8c9.jpg)
4、svn 代码冲突的解决:
使用svn管理的代码可能有多个人在维护。哪怕就是你自己也可能让trunk和branch上面的代码产生冲突。合并后的C符号就是代表文件有冲突的意思。
我解决冲突的方法是手动去掉那些不必要的代码。看留哪个。但是去掉后一些svn冲突的文件仍然存在,咋办?
svn resolved 冲突的文件名
当手动解决完冲突后你会发现这些多出来的文件仍然存在,别怕,使用上面的命令:如果你的冲突真的解决了,那么多出来的文件会自动删除掉的。可比你自己手动rm要方便的多了。
5、eclipse中创建分支与合并
创建分支:我在eclipse中的项目(主干)上的svn url: https://ajsdjksjmxmkase/svn/newrep/trunk/displaytag
然后在项目上右击——》Team——》分支/标记,出现如下:
修改URL为:https://ajsdjksjmxmkase/svn/newrep/branch/displaytag-branch,然后一直默认next就行了,此时可以看到在visual SVN的branch分支中有了display-branch项目(主干项目的copy),然后在eclipse中——》Team——》commit。
在创建了分支后,也可以不check out出分支项目到工作区,可以切换主干与分支:当你创建分支后,肯定是想在分支那修改东西。想修改分支的内容,要把本地的副本的切换到分支。操作步骤如下:
在本地工作区的package Explorer面板里,右击要切换分支的文件,在弹出的菜单现在Team->切换,在”至URL“中填写刚才创建的分支URL对应文件,就切换到分支了,而不再是主干了,当你修改提交时也是修改分支的文件。
合并(把在分支做的修改合并到主干中):
测试:在eclipse中把刚才copy的分支项目check out到eclipse中,然后做些修改,然后提交,然后在主干项目上右击——》Team——》合并——》默认next——》然后单击update升级工作副本——》在Merge from中输入要合并的分支URL:https://ajsdjksjmxmkase/svn/newrep/branch/displaytag-branch,然后合并,会出现合并的状态,这时在eclipse中的主干中的对应的文件会有修改(来自分支的),然后在主干——》Team——》commit。这样就完成了分支到主干的合并。
反之,主干到分支也一样的操作。
下来是选项的含义:
合并选项:
1、合并一个范围的版本
此类型应用最为广泛,主要是把分支中的修改合并到主干上来。在主干上点击右键选择合并,然后选择合并类型:合并一个范围的版本。合并的源URL填写的是要合并的分支的URL,待合并的版本范围如果为空,则指的是合并分支上所有的版本,即自从分支创建以来到分支当前最新版本的所有演变。如果只是选择其中一个版本,或者几个版本,那么就表示只是将制定的n个版本的变化合并到主干上。如果只是选择其中一个版本,那么表示只是选择那个版本的修改,之前或之后的修改将不被采纳。
2、复兴合并
复兴合并可以理解为是第一种合并类型的一种特例,在复兴合并中,主干可以理解为是自从开创分支之后没有任何修改,而分支是经过修改的,而且合并中分支是没有版本选择的。经过复兴合并,分支中所有的修改都会合并到主干中,合并的结果将使得分支和主干一模一样,从而可以删除分支
4、合并两个不同的树
此类型与前两种类型不同,第一种类型可以选择分支合并的版本,主干不能选择版本;第二种类型是主干和分支都不能选择合并的版本;而这种类型则是无论是主干还是分支都可以选择合并的版本,即可以选择过去的一个主干版本与分支的某个版本进行合并。合并的时候以选择的分支版本为主,如果选择的主干版本与分支版本有不同的地方,合并时主干部分将被放弃。
起始URL:选择主干目录的URL(应当和当前工作副本的URL一致,这个是所谓的合并点)
结束URL:选择要合并的分支的URL。
起始和结束的版本:一般起始版本应当找到最后一次同步时的版本,如果从没有同步过(第一次合并),则选择创建分支时的版本,结束版本一般是最新版本,如果你不想将某些内容合并进主干的话,也可以选择一个合并点。
5、仅记录的合并
选择此项意味着并没有实际的合并动作,只是在将来的合并过程中,svn将过滤掉此版本的修改动作。例如,我在合并的过程中,选择对分支的23版本只记录合并(阻止这个版本将来被合并),那么23版本并不会合并到主干中。在以后的合并中,如果选择合并分支的22到24版本,那么23版本将被忽略,要慎重使用这个选项,一旦使用了,那么表示这个版本在以后的合并中就不能再使用了。也就是:分支使用 --reintegrate 合并回主干后,如果继续在该分支上开发,当需要同步主干的修改到分支过来时,默认会包括之前 reintegrate 的修改,而这些修改已经在分支上做过了,所以这样往往会导致冲突。这也是前面“最佳实践”中最后一个建议的一个原因。当然,想要使这个分支继续可用也是可以的。忽略祖先:如果在分支上有一个文件曾经被删除过,后来又加了一个同文件名的文件,那么在merge的时候svn会识别到这两个文件不是同一个祖先而直接覆盖旧文件增加新文件。而实际上我是要对这两个不同祖先的文件进行合并的,这个时候就需要使用svn merge --ignore-ancestry 忽略祖先来进行合并才能保证正确。
合并深度:
一、工作副本:即你当前的工作目录,一般默认为这个选项;
二、全递归:即你选择的目录的版本库,包括了其下面的子文件,子文件夹,包括子文件夹里面的内容;
三、直接子节点,包括文件夹:即你选择的目录下面的文件,文件夹,但是不包括文件夹里面的子文件,子文件夹;
四、仅文件子节点:即你选择的目录下面的文件,但不包括文件夹,当然不包括的文件夹下面的所有内容也都不纳入合并范围; 五、仅此项:没有任何合并内容;
五、仅此项:没有任何合并内容。
SVN命令:http://www.blogjava.net/jasmine214--love/archive/2011/01/12/342839.html