一.常用命令
1、检出
svn  co/checkout  http://路径(目录或文件的全路径) [本地目录全路径]  --username 用户名 --password 密码


注意:username 与 password前是两个短线,不是一个,认证过可不加。本地目录非必填,默认当前目录。
eg:svn co http://test/trunk


2. 查看信息
svn info [文件路径]


没有指定文件返回当前svn仓库的信息,比如路径,分支地址,svn服务器地址等等。指定了文件,会返回这个文件的详细信息。
eg:在我的测试目录下,执行svn info 会返回:


Path: .
Working Copy Root Path: D:\project\xxx
URL: https://xxx/trunk
Relative URL: ^/xxx/trunk
Repository Root: https://svn.text.com
Repository UUID: f1e22b3a-c8a0-4bf3-8542-66ea2b9421c2
Revision: 1154742
Node Kind: directory
Schedule: normal
Last Changed Author: test
Last Changed Rev: 1154630
Last Changed Date: 2016-10-17 13:17:37 +0800 (周一, 17 十月 2016) 


3. 查看状态
svn st/status
返回当前目录下的文件的状态,例如?表示未添加,A表示已添加,M表示有修改


eg:在我的测试目录下,执行svn info 会返回:
?       xxx\test.iml
M       xxx\src\main\java\com\xxx\test.java


4、更新文件
svn update/up


5、添加新文件 
svn add 文件路径

eg:
svn add xxx\src\main\java\com\xxx\test.java


6、提交
svn commit/ci -m "备注信息" 

注意: 必须带上-m参数,参数可以为空,但是必须写上-m
eg:
svn commit -m "提交test" 


7、删除文件
svn delete svn://路径(目录或文件的全路径) -m "备注信息"

eg:
svn delete xxx\src\main\java\com\xxx\test.java -m "删除test.java"


8、加锁/解锁 
svn lock -m "备注信息" [--force] 文件路径 
svn unlock 文件路径
eg:
svn lock -m "test lock" xxx\src\main\java\com\xxx\test.java
svn unlock xxx\src\main\java\com\xxx\test.java



9、比较差异 


svn diff 文件路径 

svn diff -r version_m:version_n 文件路径

eg:

svn diff test.java :当前与修改之前比较

svn diff -r 111:222 test.java  :对版本号111 和 版本号222 比较差异



10、查看文件变更日志


svn log 文件路径

eg:

svn log test.java :显示这个文件的所有修改记录,以及对应的版本号



11、查看版本库下的文件和目录列表 


svn list/ls svn://路径(目录或文件的全路径)

eg:

svn ls svn://xxx/test : 显示svn://xxx/test目录下的所有属于版本库的文件和目录 




12、创建新目录


svn mkdir -m "新增目录备注文本" http://目录全路径

eg:

svn mkdir -m "dir test" svn://localhost/test/newdir 

注意:添加完子目录后,必须要回到根目录更新一下,否则会提示"提交失败”



13、丢弃在本地的修改 


svn revert [--recursive] 文件路径

注意: 这个命令会解除冲突的状况,不会连接svn服务器,不会恢复被删除的目录。

eg:

svn revert foo.c :丢弃对一个文件的修改

svn revert --recursive :恢复一整个目录的文件,. 为当前目录 




14、标记冲突已经解决 


svn resolved [本地目录全路径]

eg:

如果你在更新时发生了冲突,你的工作拷贝会产生三个新的文件:

$ ls

foo.c

foo.c.mine

foo.c.r30

foo.c.r31

解决了foo.c的冲突,运行svn resolved,会删除这三个冲突标记文件,解决冲突。




15、不checkout而查看输出特定文件或URL的内容 


svn cat http://文件全路径

eg:

svn cat http://xxx/test.txt



16、导出(导出一个干净的不带.svn文件夹的目录树)


svn export 

注意;与checkout不同的是没有.svn文件夹。导出的文件脱离SVN版本控制,修改后无进行Update和Commit操作。



16、导出(导出一个干净的不带.svn文件夹的目录树)


svn export 

注意;与checkout不同的是没有.svn文件夹。导出的文件脱离SVN版本控制,修改后无进行Update和Commit操作。



17、导入(本地目录导入到版本库)


svn import -m "import" test http://svn.red-bean.com/repos/branches/test


注意;与export相反,将本地目录导入到版本库。与add不同的是直接更新到远程版本库。无需commit.

原先的目录树并没有纳入版本控制,为了开始工作,你还是要运行svn checkout得到一个干净的目录树工作拷贝。




二.分支创建



1、新建一个分支




svn copy/cp branchA branchB  -m "new branch" 


从branchA拷贝出一个新分支branchB,正常情况下,branchA都是trunk。生成tag,也是这个命令,只需要把路径修改就可以了。




2、切换分支


svn switch/sw http://目录全路径 [本地目录全路径]

eg:

svn switch http://xxx/test/123 

注意:本地目录全路径可以不填,默认当前目录。




三.分支合并



1.在分支执行,得到分支从trunk checkout出来的最早的版本号。如下面是1089035



$ svn log -v --stop-on-copy 


------------------------------------------------------------------------

r1089035 | user | 2002-11-03 15:27:56 -0600 (Thu, 07 Nov 2002) | 2 lines





2.可以使用--dry-run 参数模拟合并,预览是否有冲突。


svn merge --dry-run -r 1089035:HEAD https://branch/xxx



3.合并,HEAD是最新的版本号。下面的命令代表把分支的所有版本的改变合并到trunk.


svn merge -r 1089035:HEAD https://branch/xxx




四.冲突解决




1.解决文件冲突




(1)、svn update后,1.txt文件出现冲突,选择base版本,即1.txt.rOld作为最后提交的版本

$ svn resolve –accept base



(2).手工修改1.txt文件,然后将当前拷贝即1.txt作为最后提交的版本

$ svn resolve –accept working 1.txt



(3).使用1.txt.rNew作为最后提交的版本

$ svn resolve –accept theirs-full 1.txt



(4).使用1.txt.mine作为最后提交的版本 

$ svn resolve –accept mine-full 1.txt




2.解决树冲突




(1).什么是SVN树冲突?

  SVN树冲突不是常说的冲突。常说的冲突,是指不同的人同时改了某个文件的同一处内容,于是在合并时产生冲突。而树冲突是指,

对文件或目录本身的名称、位置进行了改变,或进行了文件或目录本身的添加、删除操作,而这些操作在合并(包括更新操作)时带来了冲突。

可参考SVN自带的帮助文档,第2章"Basic Usage”的"Dealing with Structural Conflicts”一节。



(2).如何避免树冲突?


      分支一定要从所在SVN项目的主干上拉出来,不要从其他位置特别是其他项目拉出来。即便本SVN项目主干上还"啥都没有”,也一定要从这里拉分支。

      请不要在删除一个文件或目录后,又再次添加。特别是像ver、mapping之类的文件和目录。这类操作造成的树冲突特别具有迷惑性。

     尽量不要更改文件和目录的名字,除非你确定小伙伴们最近不会碰它(修改名字或内容)。

     尽量不要在不同的分支上同时增加相同名称的文件或目录。


(2).树冲突快速解决方法。

   确定在你解决树冲突期间,主线不会有新的变化。

   基于主线,创建新的分支,命名为(比如)branch1_new。并把它checkout到本地。

   将出问题的分支上的内容export到新分支上。具体命令为:

       svn export --force <url of old branch> <local working copy of new branch>

    如果有需要删除的文件(主干上有,分支上确实想删除的),用svn rm命令删除。