摘自百度百科:

SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。

SVN不允许递交后回滚。建议把版本库里好的状态版本加到末尾,覆盖掉损坏的版本。而损坏的版本无论如何也是会存在数据库里的。(SVN的滚回操作实际上是merge操作)

缺点

1、服务器压力太大,数据库容量暴增。
2、如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
3、不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。

优点

1、管理方便,逻辑明确,符合一般人思维习惯。
2、易于管理,集中式服务器更能保证安全性。
3、代码一致性非常高。
4、适合开发人数不多的项目开发。
一般svn版本库目录建议创建trunk、branches和tags三个目录。在实际操作时,trunk主干版本要时刻保持干净,即随时可以基于这个版本进行修改并将应用部署上线。branches是分支目录,存放并行开发的项目代码,因为分支是主干的廉价拷贝(相当只是提交了一次主干版本,增加了一个版本号,并没有取出版本库作镜像拷贝),所以你可以放心建立很多分支版本。不过Subversion不支持跨版本库的拷贝,当使用svn copy时你只能在同一个版本库内操作。
常用命令:
下载项目:

查看文件状态:

更新代码:

代码比对:

预定提交到版本库:

最后一步是提交:

删除文件

多人合作冲突在所难免

QQ20151118-0

普及下:

(dc) display-conflict – show all conflicts (ignoring merged version)  #显示所有冲突
(mc) mine-conflict    – accept my version for all conflicts (same)    #冲突以本地为准
(tc) theirs-conflict  – accept their version for all conflicts (same) #冲突以服务器为准
(mf) mine-full        – accept my version of entire file (even non-conflicts)#完全以本地为准
(tf) theirs-full      – accept their version of entire file (same)    #完全以服务器为准

(p)  postpone         – mark the conflict to be resolved later        #标记冲突,稍后解决

一点小技巧:

svn 自身的diff并不是很好用,对于vimer,我们可以使用vimdiff;

项目路径

提交历史查询:

 

有时候,我们开发的分支是基于trunk的某个版本12972,然后我们开发完毕此时trunk又多了更新此时12991。我们要把trunk合并到分支。命令如下:

如果有冲突选择p(postpone),merge完了之后使用svn st|grep ^C查看冲突文件,然后比对修改冲突文件。解决冲突后再check in ,信息写上执行的merge操作。

分支merge到trunk上:

如果有冲突选择p(postpone),merge完了之后使用svn st|grep ^C查看冲突文件,然后比对修改冲突文件。解决冲突后再check in ,信息写上执行的merge操作。

从开发分支pull trunk代码:

pull代码前可以预览利用–dry-run。

 

svn错误local add incoming add upon merge问题?

 

svn中的版本回滚就是merge,很烦人。不想git。这个问题导致分支合并你没改动的文件都会显示修改。好恶心,但又无奈!!!!

#1 改动没有被提交(commit)。
这种情况下,使用svn revert就能取消之前的修改。
svn revert用法如下:

当path为单个文件时,直接svn revert path就行了;当path为目录时,需要加上参数-R(Recursive,递归),否则只会将path这个目录的改动。
在这种情况下也可以使用svn update命令来取消对之前的修改,但不建议使用。因为svn update会去连接仓库服务器,耗费时间。
注意:svn revert本身有固有的危险,因为它的目的是放弃未提交的修改。一旦你选择了恢复,Subversion没有方法找回未提交的修改。

#2 改动已经被提交(commit)。
这种情况下,用svn merge命令来进行回滚。
回滚的操作过程如下:
1、保证我们拿到的是最新代码:
svn update
假设最新版本号是128。
2、然后找出要回滚的确切版本号:
svn log [pathj]
假设根据svn log日志查出要回滚的版本号是125,此处的path可以是文件、目录或整个项目
如果想要更详细的了解情况,可以使用svn diff -r 128:125 [path]
3、回滚到版本号125:
svn merge -r 128:125 path
为了保险起见,再次确认回滚的结果:
svn diff [path]
发现正确无误,提交。
4、提交回滚:
svn commit -m “Revert revision from r128 to r125”
提交后版本变成了129。

有时候,我们从trunk开出分支,过了一段时间,底层代码更新了。需要开发的功能需要依赖这个底层代码开发,此时从trunk更新代码。

svn merge svn://trunk

然后继续开发。开完完毕的过程中可能涉及到多次从trunk更新。

最后,开发分支归并到trunk上。

svn merge –reintegrate svn://branches/abc

通过–reintegrate参数,可以仅从branch上合并该branch上独有的修改回trunk,避免产生合并冲突。对比git分支开发优点繁琐。git分支直接pull master即可,再归并到master也避免了合并冲突。

参考文档:

https://i18n-zh.googlecode.com/svn/www/svnbook-1.4/svn.branchmerge.commonuses.html