1、什么是SVN(subversion)?
SVN是一款非常优秀的版本管理工具,是一个跨平台的开源版本控制系统。
2、SVN是一种集中式文件系统版本管理系统,集中式管理的工作流程如下图:
集中式代码管理的核心是svn服务器,所有开发者新来的第一天必须从服务器获取代码,然后开发,最后解决冲突,提交,所有信息都放在svn服务器上。

3、概念解释
trunk(树干):主开发目录,表示开发时版本存放的目录,即在开发阶段的代码都提交到该目录上;
branches(分支):分支开发目录,是用来做并行开发的,这里的并行是指和trunk进行比较;
tags(标记):表示标签存放的目录,是用来做一个milestone的,不管是不是release,都是一个可用的版本。这里,应该是只读的,tag上不做任何代码修改。
具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。
4、目前我们欧普开发使用的一种规范大概如下:
a.起初(项目刚开始阶段),我们的所有的开发都是基于trunk进行开发;
+trunk/ (都在这里开发)
+branches/
+tags/
b.当第一阶段上线完成并正式上线(开发、测试、文档、制作安装程序、打包等),这时候会在tags打个release_1.0的tag,代表首次上线的一个里程碑;
+trunk/
+branches/
+tags/
+release_1.0 (copy from trunk)
c.第一次上线之后又有新的需求开发(一般指不能在短时间内完成的需求),这时候会从trunk开设一个分支dev_2.0_demo_branch进行新需求开发;
+trunk/
+branches/
+dev_2.0_demo_branch (copy from trunk,此时在该分支做新的需求开发)
+tags/
+release_1.0
d.在新需求开发的同时,发现1.0上线的又有严重的bug需要改动并重新发布上线,这时候需要区分这个bug是否可以在短时间内解决(一般1天内);
I.一天内可以解决,直接在trunk改动代码并且发布,然后打个release_1.1的tag;
+trunk/
+branches/
+dev_2.0_demo_branch (继续在该分支做二期新需求开发)
+tags/
+release_1.0
+release_1.1 (copy from trunk)
II.不能在短期内解决,可能需要几天甚至个把星期,此时需要从trunk开设一个分支release_1.0_bugfix进行bug解决;
+trunk/
+branches/
+dev_2.0_demo_branch (继续在该分支做二期新需求开发)
+release_1.0_bugfix (在该分支解决一期bug)
+tags/
+release_1.0
解决完bug之后经测试无问题,再把release_1.0_bugfix的代码merge到主干trunk上面,然后打包发布,同时也需要打个release_1.1的tag
III.
e.等二期新需求开发测试完成,准备上线时,需要把dev_2.0_demo_branch的代码merge到主干,并从主干打个release_2.0的tag
+trunk/ (从分支merge代码,然后打包发布到正式机)
+branches/
+dev_2.0_demo_branch (二期需求开发完成,把代码merge到trunk)
+tags/
+release_1.0
+release_2.0 (copy from trunk)
f.如此循环执行以上步骤;
5、注意点
a.trunk是放置稳定代码的主要环境,除非你必须处理一些容易且能迅速解决的BUG,一般不要在trunk直接做开发。要在任何时间点都能保证trunk的代码随时可以正常发布到正式机;
b.当一个branch完成了,并且认为它足够稳定的时候,它必须合并回它原来拷贝的地方,也就是说:如果原来是从trunk中拷贝的,就应该回到trunk去,或者合并回它原来拷贝的父级branch;
c.除非是因为必须从一个branch中创建一个新的子branch,否则新的branch必须从trunk创建;
d.作为一个开发者,永远不要切换至、取出,或者向一个tag提交任何内容,一般tag为只读,只代表一个里程碑;