从前用svn,只会从库中导出代码,上传代码,其他的统统不懂,可谓不求甚解,今天被告知不能动用主干的代码,做哪一部分的需求就去下哪一部分的分支,否则修改了主干的代码,会需要到主干上查找并回滚,如果还有想要保留的修改就更加麻烦,所以总结一下svn的使用,避免真的酿成大错。
一、关于主线与分支
1.创建分支的意义:避免子项目/子需求之间的相互干扰
创建分支的意义,比如我们在一个基础平台上进行开发,每个技术小组负责一个子项目,而基础平台也是有可能会继续更改的,这个时候,如果不创建分支,子项目之间会相互影响,影响最大的就是后期的测试和版本发布,子项目A已经结束,但测试却受到正在进行的子项目B的影响,测试通不过,就别说版本发布了。所以,我们需要从目前的项目(主干trunk)中创建分支(branch),隔离子项目间的相互影响。知道了创建分支的意义,那么如何创建呢,下面请看SVN分支与合并介绍中创建的原理。
2.创建分支的方法:进行拷贝、主干分支公用一套版本号
在svn中,创建分支,实际上就是一个版本拷贝(对应copyto...注意:绝不是简单在客户端上copy一个目录,而是svn仓库中copy,文件版本号会增加。),两边做任何修改发生的版本变化,是一套机制。举例:目前主干版本是100,分支版本是101,主干中增加一个文件,版本为102,分支中再增加一个文件,版本就为103了。两边的版本号是一套,不会重复。
3合并:合并的命令是from ${某一版本号} to ${某一版本号},可能与通常意义上我们理解的from to产生歧义。
合并方法如下:
①如果是需要将主线的改动合并到分支上,
A.需要在分支的工作副本下进行合并,
B.合并的范围是需要从主线上上次合并的版本到当前主线上最新的版本,如果主线和分支都修改了相同的文件,合并后会出现冲突,然后解决冲突,如果主线修改但是分支没有修改,则主线上合并的变更内容会增加到当前副本中,
C.提交,如果是第一次合并,则起始版本号是上次建立分支的版本号
②相反,如果是需要将分支的改动合并到主线上,
A.需要在主线的工作副本下进行合并,
B.合并的范围是需要从分支上上次合并的版本到当前分支上最新的版本,合并后会出现冲突(冲突的前提如上种情况),然后解决冲突,
C.提交,如果是第一次合并,则起始版本号是上次建立分支的版本号
Reference:http://developer.51cto.com/art/201005/202663.htm
http://developer.51cto.com/art/201005/202661.htm
二、svn部分使用方法
Reference:http://toxy.javaeye.com/blog/72219
1。版本管理约定
程序员编写程序的过程中,每个程序都会有很多不同的版本,这就需要程序员很好的管理代码,在需要的时间可以取出需要的版本,并且每个版本都有一个完整的说明。
我们使用Sub Version(简称SVN)作为版本管理工具。这里着重介绍SVN作为跨平台的多人协作使用方法。在多个程序员管理同一段代码的过程中,版本的管理显得尤为重要,使用SVN可以方便的进行分支、合并,记录下所有的版本。
2。SVN基本配置
在开始某项软件、文档的开发与撰写时,首先由配置管理负责人建立SVN仓库、用户名及其权限,并通知相关人员SVN仓库地址、SVN仓库负责人。
2.1 配置强制注释
SVN仓库的负责人把工程的tsvn:logminisize设置为1,以便强制注释。设置方法:在你的工程文件夹右键->属性中,进入 Subversion标签,选中tsvn: logminisize,确保复选框recursive选中,然后点击Set按钮把它的值设为1,其意思是指提交的注释最短长度为一个字。如图:
3. SVN软件配置
3.1 忽略文件
在SVN 的[Setting]的[General]中,设置需要忽略的文件以便忽略掉一些临时的、无用的文件,常被忽略的文件有*.opt *.ncb *.suo *.plg *.pch *.idb *.pdb *.scc *.obj Debug Release *.o *.bin *.out *.ilk *.aps debug release *.clw *.bak。每个程序员可以根据自己的需要进行修改忽略文件,上面只是使用VC++与Tornado编程时常用的一些忽略文件。
3.2 合并比较工具
在Merge Tool中可以选择用来合并的工具,强烈推荐用Araxis Merge。在[Setting]->[Diff]中填入"C:/Program Files/Araxis/Araxis Merge v6.5/Merge.exe";在[Setting]->[Merge]的选项中,填入"C:/Program Files/Araxis/Araxis Merge v6.5/Merge.exe" %theirs %mine %merged ;其中"C:/Program Files/Araxis/Araxis Merge v6.5/Merge.exe"是指合并工具的路径,%theirs %mine %merged分别指..将要合并到主干的分支,主干,及合并后的结果。
4.仓库目录结构
仓库的一级目录只有两个,分别为code和doc。其中,doc主要用来放置先期的文档,code主要用来放置工程的代码,也可以包含后期的文档。
仓库的二级目录只可以是branch与trunk两个目录,分别存放主干与分支。trunk目录下直接存放工程文件。branch目录下包括一些子目录分别对应各个分支。
4.1 本地目录结构
从SVN仓库中取出代码时,一定不要把整个仓库取出来,而应该只取出trunk目录,或只取出branch下的某个分支目录
5.合并开发方法
5.1 合并开发基本流程
一个项目会有多个人共同合作开发完成。基本流程是:
- 各开发成员建立自己的分支,并在此分支上开发
- 各开发成员把分支合并到主干上并形成较为稳定
- 各个成员重新从主干上建立新的分支,在此分支上开发(即回到第一步)
- 循环往复,直到工程结束。
下面我用一个例子来说明合作开发的基本流程。
现在xb与lzj两个开发人员要共同开发一个工程onlytest,其这个工程的主干的SVN仓库地址如下图。
5.2 分支的建立
xb与lzj分别在onlytest这个工程中建立两个分支,分别为xb _051115和lz_051115。
在这里分支命名要采用[姓名缩写_6个数的日期_后缀(可选)]的形式,比如xb_051208_1,xb_051212之类的。 建完之后, xb和lzj分别在本地取出对应的分支进行开发。
6. 其它注意事项
6.1 SVN中的标签
与CVS不同,使用SVN时不用专门为目录添加标签,因为SVN也对目录进行版本管理。
我们在提交时写好注释(比如重要的版本提交时使用051201之类的日期作为开头),就可以通过注释来查找比较重要的目录版本号,相当于CVS或VSS中的标签。
另外,每个工程都会有一个版本说明文件,通过此文件可以查找关键版本。
6.2 文件的删除、移动与重命名
你可以重命名、移动或删除你的文件或文件夹,但请使用SVN进行这些操作,否则之前的版本信息会丢失。
使用SVN删除、移动与重命名文件夹的方法是在文件/文件夹上点右键进行SVN操作,或直接在资源浏览器中使用右键拖放(会弹出SVN选项)。文件的删除、移动与重命名之前,必须保证工作目录是最新的版本;进行这些操作之后,需要进行提交。
6.3 版本的回退
在代码的编写过程中,难免会有不尽人意的地方,你也许需要回退到某一个版本,但是在这个过程中可能有一些文件你想保留,也有一些文件你不想保留,这就牵扯到很复杂的版本管理过程,在这里给大家推荐几种方法。
6.3.1 若是你编辑了工程,在没有提交的前提下,你想放弃这些修改,你可以直接选择revert就可以更新到工程的最新的版本。
6.3.2 若是你想退回到某一个版本,你就可以直接选择update to reversion如图,这样我们就可以把我们的版本回退到你选中的版本去,这种情况下SVN并没有显示出有什么冲突,并且新建立的文件也还在,但是在这种情况下你并不能直接在你回退后的版本上进行编辑,因为SVN的版本控制还是在最新的主干上。我们需要 update并解决冲突。
6.3.3 你可以直接选择revert changes from this revision,这样的话你可以直接解决冲突并提交。不过这种方法的不足是,你新建的文件都没有了,整个工程都回退到之前的版本了。
6.3.4 我推荐的一种方法是,直接export一个你需要的版本,然后用你export的版本覆盖你的最新的版本,这样你就可以不丢失你新建的文件,同时获得head的SVN控制文件。
6.4 提交的时机
每个工程会有很多个小模块,当某个模块达到稳定的时候,你就需要提交一次,以免写下个模块代码的时候出现不可恢复的错误。
每一次提交需要前,需要通过pclint检查,保证是一个编译没有错误的版本。当提交比较稳定的版本的时候,同时要修改你的版本号。
提交的时候要添加注释,若多人共同修改同一段代码我们就需要为注释添加上更加详细的说明
6.5 版本说明文件
版本说明文件为xml表格,可用excel编辑,它会记录下关键的版本信息。
版本说明文件内容如下表。发布版本是指用户对外公布的版本号,后文中有详细描述;Revision是SVN内部的工程文件夹的版本号。一个发布版本可能对应多个Revision