SVN简易使用手册

SVN简易使用手册
SVN是一种类似于CVS的版本控制软件,它的操作方法也与CVS类似,但是它弥补了CVS的很多不足和做了很大的改善和提高。在这个手册中,主要描述的是它的客户端的使用方法,至于服务器的配置,在另一篇手册中说明。

 


SVN中的修订版本号
当新建一个版本库时,它的修订版本号为0,每当执行一次提交命令时,它的修订版本号就增加1,SVN也用一些关键字表示某一些版本:

HEAD:版本库中最新的版本

BASE:工作拷贝中一个条目的修订版本号,如果该版本在本地修改了,则“BASE版本”就是这个条目在本地未修改的版本。

COMMITTED:在BASE版本之前(或者BASE)一个项目最后修改的版本。

PREV:一个项目最后修改版本之前的那个版本。

 


SVN命令
SVN的命令格式为 svn command [options]

其中command是svn要执行的命令,签出,提交,更新等。主要的命令及命令格式如下:

checkout
checkout可以简写为co。它是从版本库中将文件(夹)签出到工作目录中。命令格式如下:

svn co URL[@REV] [path]

URL是版本库的地址,REV是要签出的版本号。path指定工作目录,如果不指定则是当前目录。

commit
将本地修改(包括文件内容修改,添加删除文件,文件夹等)提交到SVN版本库中。其命令格式主要如下:

svn commit -m”message” [path]

-m是必须的,它后面接着的是日志的内容message,message可以为空。但是强烈建议大家添加日志内容,描述本次提交的目的和修改的范围。path指定要提交的目录,以递归的方式提交该目录下的子目录和文件。如果不指定path,则默认是当前目录。

注意:在commit之前,一定要使用一次update命令(下面介绍),并且再测试,无检测出bug之后才提交,避免版本库中的代码充满bug。(为什么要执行update以及执行它之后可能出现的情况请看本文档结尾)

update
将版本库的最新版本下载到本地。命令格式如下:

svn update [path]

选项path的作用和commit中path的作用一样。

update时候,在执行结果中会列出结果,其结果如下所示

[status] [filename]

status包括A(添加文件),D(删除文件),R(替换文件),U(更新文件),C(版本库与本地文件冲突,无法合并),G(版本库中的文件与本地文件合并),filename是发生发生了上述改变的文件的文件名。发生冲突的解决方法请看本文档结尾)

status
显示本地文件的状态。其命令格式如下:

svn status [path]

选项path和commit中的选项path一样。

status执行的结果由若干列组成,列与列有空格分开,状态很多,在这里不详细说,其中第一列的状态包括A,D,R,U,C,M,请参考update命令,还有"?",表示该文件没有被版本化,请使用add命令将其加进版本库中,"!"表示文件丢失,比如不使用SVN命令delete而删除了文件。其它状态不在这里描述。

add
添加文件(夹)到版本库中,它是做一个标志,在commit才会真正添加进去。它的命令格式如下:

svn add path

path是指定要添加的文件或者目录

delete
删除文件(夹)。同add命令的一样,它也是先做一个标志,在commit时才改变版本库。命令格式如下:

svn delete path

path选项同add

diff
diff命令用于比较文件的差别。其主要的命令格式如下

svn diff [filename]

filename是要比较的文件路径,如果它是一个目录的话,则会比较该目录下面所有的文件。不指定path则默认为当前目录。diff也可以指定要比较的文件的版本号,在这里不详细描述。这个简单的命令格式比较的是文件的当前状态和它被签出或被更新时候的状态,它并不自动比较当前文件和版本库中最新版本的文件的差别,它显示的是该文件被更新后被修改的情况。

revert
将文件恢复到它被签出或上一次被更新的状态。执行这个命令,可以恢复对指定文件的修改,不能恢复对文件夹的删除操作。命令格式如下:

svn revert filename

filename同diff中的filename。它不能省略。

resolved
删除文件冲突的标志。在执行update的时候,有可能文件被标志为冲突(C),使用这个命令可以去除这个标志,但是它并不能解决冲突。解决冲突的问题由开发人员协商解决。其命令格式如下:

svn resolved filename

filename指定文件名

 

 

 

commit前执行update的原因
当从版本库签出源代码到工作目录后,所有的编辑,修改都是改变工作目录中的内容,而不是实时的反映到版本库中,知道commit才会修改版本库。在多人协同开发的环境下,往往在自己进行修改源代码的时候,别人已经commit了导致版本库内容改变,这个时候,工作目录中的文件都已经“过时”了,如果将这些“过时”的代码提交到版本库中,会产生意想不到的结果。举例说,版本库中有文件a.h,a.c,并且宏MAX在a.h中定义,在a.c中用到。开发人员Peter和Amy。如果Peter修改了a.h,删除了宏MAX,再提交到版本库中,而此时,Amy仍然修改着a.c,当他修改完并且直接提交后,版本库中的文件情况如下a.h(由Peter修改),a.c(由Amy修改),这时的代码,a.c所使用的MAX在a.h中无定义了。一个BUG被无意中引入!因此在执行commit前一定要执行一遍update,否则版本库会变得很混乱。

 


冲突的产生
多人协同开发的情况下,多个人同时修改同一个文件的情况是很常见的。他们从版本库中签出同样一份源代码。如果他们修改了同样一个文件的话,SVN会尝试将这些修改合并,如果合并成功,则标志为合并(G,请参考update命令),如果SVN无法将这些修改合并,就会设置冲突标志(C,请参考update命令)。主要体现在不同的人对同一份文件的同一个地方做出了不同的修改(比如修改第10行的文字),SVN不能也不应该决定应该选择哪份修改而丢弃另一分修改,因此,它标志文件为冲突,由开发人员进行协商解决。

 


解决冲突的方法
冲突发生时,SVN会放置三个未版本化的文件到工作目录中:

filename.mine: 文更新前的被修改的文件

filename.rOLDREV: 更新前文件的BASE版本

filename.rNEWREV: 文件在版本库中的最新版本

发生冲突时,需要开发人员之间协商来决定使用哪一部份的代码。再执行resolved命令将冲突标志去除,resolved命令也将上述新建的文件删除。

在发生冲突的文件中,SVN会添加额外的标志标识冲突的地方,比如filename发生冲突,那么filename变成如下形式:

Lettuce

Tomato

<<<<<<< .mine

Salami

Mortadella

======

Sauerkraut

Prosciutto

>>>>>> .r2

Creole Mustard

Bottom piece of

 


其中的小于号,等于号,大于号是SVN添加的冲突标记。它表示:

小于号和等于号之间是你当前工作目录中所修改文件的内容,等于号和大于号之间的部分是版本库中文件的内容,其它部分是它们之间相同的部分。

 

 

 

参考文献

[1] Ben Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato, 使用Subversion进行版本控制—针对subversion 1.2

[2] svn --help


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kceiw/archive/2008/04/18/2305748.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值