svn 实战
版权声明:如有转载请求,请注明出处:http://blog.csdn.net/yzhz 杨争
本人在在以前一篇文章"svn的最佳实践"介绍了使用svn进行版本控制的思想,本文进一步从实战的角度介绍如何使用svn,其中重点阐述了svn的一些重要概念,便于大家更好地理解svn,这样有利于指导我们的在实际开发过程中的svn操作。
一、svn版本号(revision number)
1、 SVN的修订版本号是基于整个版本库的,所以当你新建了一个svn版本库,从修订版本号0开始,每一次成功的提交(svn ci)版本号加1,不管这时你是新增还是删除文件,是在分支上还是在主干上。
2、一个修订版本号代表了版本库的一个快照。同一修订版本号的相同文件在不同版本树(主干、分支)上有可能是不一样的。
svn cat file:///"j:/yzrepos/test/trunk/f.txt" -r 19
f
svn cat file:///"j:/yzrepos/test/branches/0611/f.txt" -r 19
f
f1
3、工作拷贝并不一定对应版本库中的最新版本,除非是做了一次svn up,会使得工作拷贝中的所有文件的版本对应版本库的最新的同一修订版本。
svn status -v 工作拷贝中每个文件的版本号:
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
4、svn的每个版本已经包含了整个目录树的信息,所以我们可以svn up -r 19 file:///"j:/yzrepos/test/trunk/ 。
二、svn命令详解
只介绍最常用的svn命令:
1、svn add
svn add * 新增当前目录下的所有文件,包括子目录下(子目录下的文件)
2、svn status
svn status 查看当前目录下所有文件和目录的状态,这条语句对我们了解当前工作拷贝中文件的状态非常有帮助。
? item 文件或目录item不在svn的控制中
M item 文件item的内容被修改
C item 文件item发生冲突
A item 文件、目录预定加入到版本库
svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
3、svn help <subcommand> 查看子命令的语法、参数以及说明。
4、svn log 查看log信息
svn log http://svn.example.com/repos/branches/20060411 可以查看该分支的所有历史log,包括该分支以前的主干的log日志,因为该分支是从主干copy过来的。
svn log --stop-on-copy http://svn.example.com/repos/branches/20060411 只查看该分支的历史log,不跨越不同的拷贝。
svn log http://svn.example.com/repos/trunk 只能查看该主干的历史log,而不能看分支的log。
5、svn switch 分支、主干之间的切换, 注意:切换时本地工作拷贝的修改将会保留,这有时候对于我们很重要哦。
6、大家要学会使用svn的命令,掌握它有助于我们更深入地了解svn,不要完全依赖svn的图形化工具。
三、合并
合并的操作是版本控制中最基本,最重要,也是最容易出错的地方。
svn merge -r 1:10 http://svn.example.com/repos/calc/trunk
记住一句话就可以:该操作是将某个版本树(主干或者分支)上版本号为10与版本号为1的差异合并到当前工作拷贝中。
三个点:当前你的工作拷贝,你需要把哪个版本树上哪两个版本号的差异合并到当前工作拷贝的版本中,要避免重复合并。
三、解决冲突:
出现冲突的两种情况:
1、svn up的时候 工作拷贝和服务器在同一版本树,当工作拷贝的改动与服务器的改动冲突时,会出现冲突。
2、svn merge的时候 比如我们将分支上的某个初始版本2和最终版本3的差异合并到主干上,那么如果分支初始版本2和最终版本3的差异 与 主干当前最新版本4和主干版本2的差异有相同的改动,那么这些相同之处就会有冲突。
出现冲突时,svn就会把冲突的文件标记C,同时生成三个临时文件,分别代表本地工作拷贝的最初版本,修改后的版本和从服务器取到的最新版本。
解决完冲突后,然后调用svn resolved,svn会删除那三个临时文件。
四、分支
1、建立分支
(1) svn copy trunk branches/my-calc-branch
svn copy命令将trunk工作目录下的所有目录和文件拷贝到一个新的目录branhes/my-calc-branch下
(2) svn copy http://svn.example.com/repos/calc/trunk /
http://svn.example.com/repos/calc/branches/my-calc-branch /
-m "Creating a private branch of /calc/trunk."
这两种是有区别的,
前面是以当前工作拷贝为基础,后者以当前服务器的最新版本为基础。
前者copy后的目录并没有在版本库中,需要执行svn add和svn ci才到版本库中,后者直接在服务器的版本库中操作。
2、实际上svn中没有内在的分支概念—只有拷贝。