SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。
svn服务器有2种运行方式:独立服务器和借助apache运行。两种方式各有利弊,用户可以自行选择
svn存储版本数据也有2种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点

集中式管理的工作流程如下图:
集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本信息都放在服务器上。如果脱离了服务器,开发者基本上可以说是无法工作的。下面举例说明:

开始新一天的工作:
1、从服务器下载项目组最新代码。
2、进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码(很多人都有这个习惯。因为有时候自己对代码改来改去,最后又想还原到前一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了)。
3、下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。
这就是经典的svn工作流程,从流程上看,有不少缺点,但也有优点。
二:SVN的分支、主干合并的使用说明
名称及功能说明:
Trunk: 主干代码 (用于新功能的开发)
Branch: 分支代码(用于解决项目路径中产生的bug)
Tags: 版本标记(测试通过后上线的版本记录)
使用习惯:
1、在发现bug后,从主干生成一个分支,并在该分支上做bug修复;如修复时间较长,则保持“经常从主干合并到分支(即更新主干代码至分支)”的动作习惯。
2、从主干合并至分支,则“操作目标为分支”,也就是在分支目录中点击右键菜单。
3、从分支合并至主干,则“操作目标为主干”,也就是在主干目录中点击右键菜单。
三:SVN更新项目A C D M G U R I的含义
A:add,新增C:conflict,冲突D:delete,删除M:modify,本地已经修改G:modify and merGed,本地文件修改并且和服务器的进行合并U:update,从服务器更新R:replace,从服务器替换I:ignored,忽略四:SVN分支与合并
一、 分支与合并的概念:
分支:版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上。这条线被称为分支。分支经常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足够稳定之后,开发品的分支就可以混合回主分支里(主干线)。
合并:分支用来维护独立的开发支线,在一些阶段,你可能需要将分支上的修改合并到最新版本,或者将最新版本的修改合并到分支。
二、 SVN分支的意义:
简单说,分支就是用于区分开发版本与当前发布版本的。
1、 主干负责新功能的开发
2.、分支负责修正当前发布版本的bug(对于可以放入下个发布版本的改进性bug可以直接在主干上开发)
3.、分支上修改的bug,经常性merge到主干上,尽量及时merge(避免大面积红色区域)。
4.、只能分支往主干靠拢(merge),不能反向!
5.、直到下个新版本发布,该分支停止修改
对svn分支合并类型和深度的理解:
合并的工作是把主干或者分支上合并范围内的所有改动列出,并对比当前工作副本的内容,由合并者手工修改冲突,然后提交到服务器的相应目录里。如果当前工作副本是主干,则合并的范围是分支上的改动,如果工作副本是分支的,则合并范围是主干上的改动,并且一定要注意,合并的起始位置URL一定要和当前的工作副本的URL是相同的。
一、合并一个范围的版本
此类型应用最为广泛,主要是把分支中的修改合并到主干上来。在主干上点击右键选择合并,然后选择合并类型:合并一个范围的版本。合并的源URL填写的是要合并的分支的URL,待合并的版本范围如果为空,则指的是合并分支上所有的版本,即自从分支创建以来到分支当前最新版本的所有演变。如果只是选择其中一个版本,或者几个版本,那么就表示只是将制定的n个版本的变化合并到主干上。如果只是选择其中一个版本,那么表示只是选择那个版本的修改,之前或之后的修改将不被采纳。
二、复兴合并
复兴合并可以理解为是第一种合并类型的一种特例,在复兴合并中,主干可以理解为是自从开创分支之后没有任何修改,而分支是经过修改的,而且合并中分支是没有版本选择的。经过复兴合并,分支中所有的修改都会合并到主干中,合并的结果将使得分支和主干一模一样,从而可以删除分支。
三、合并两个不同的树
此类型与前两种类型不同,第一种类型可以选择分支合并的版本,主干不能选择版本;第二种类型是主干和分支都不能选择合并的版本;而这种类型则是无论是主干还是分支都可以选择合并的版本,即可以选择过去的一个主干版本与分支的某个版本进行合并。合并的时候以选择的分支版本为主,如果选择的主干版本与分支版本有不同的地方,合并时主干部分将被放弃。
起始URL:选择主干目录的URL(应当和当前工作副本的URL一致,这个是所谓的合并点)
结束URL:选择要合并的分支的URL。
起始和结束的版本:一般起始版本应当找到最后一次同步时的版本,如果从没有同步过(第一次合并),则选择创建分支时的版本,结束版本一般是最新版本,如果你不想将某些内容合并进主干的话,也可以选择一个合并点。
实例:
实例:
主干A在95版本的时候创建分支B,此时两棵树都是95版本
1、 我在分支B上增加文件test.txt,提交。此时版本库升级到了96版本;
2、 我在A上选择合并类型1,合并分支最新版本,结果是把test.txt加入A;
3、 我在A上选择合并类型2,合并分支最新版本,结果同上;
4、 我在A上选择合并类型3,合并分支最新版本,结果同上;
5、 我在A上增加文件test2.txt,提交,此时版本库升级到了97版本;
6、 我在A上选择合并类型1,合并分支最新版本,结果是把test.txt加入A;
7、 我在A上选择合并类型2,合并分支最新版本,结果是把test.txt加入A;
8、 我在A上选择合并类型3,主干选择当前97版本,合并分支最新版本,结果是把test.txt加入A,把test2.txt从A删除;
9、 我在A上选择合并类型3,主干97以前的版本,合并分支最新版本,结果是把test.txt加入A,而A中保留着test2.txt。
将分支合并到主干上,首先需要在主干的工作副本下进行,合并的范围是从主干的上次合并的版本开始到分支上最新的版本结束,如果是第一次合并,则从主干创建分支的版本开始,所以每次合并要做好说明,在日志中体现,不然忘记了下次再合并就有点麻烦。其实,应当尽量避免一个分支合并多次,分支的作用一般为了解决bug,一旦bug对应结束了,分支的使命就结束了,以后再出现其他的问题,应当重新建立分支,这样就不会出现多次合并的问题了。
分支的合并深度
合并深度:
一、工作副本:即你当前的工作目录,一般默认为这个选项;
二、全递归:即你选择的目录的版本库,包括了其下面的子文件,子文件夹,包括子文件夹里面的内容;
三、直接子节点,包括文件夹:即你选择的目录下面的文件,文件夹,但是不包括文件夹里面的子文件,子文件夹;
四、仅文件子节点:即你选择的目录下面的文件,但不包括文件夹,当然不包括的文件夹下面的所有内容也都不纳入合并范围;
五、仅此项:没有任何合并内容。