本文总结了完成一个需求开发所需知道的SVN基本指令。

阅读本文前,推荐先参考米扑博客:SVN 常用命令

一般开发流程

  1. 获取代码(更新代码): svn co master
  2. 新建分支:svn co master branch
  3. 查看分支:svn status branch
  4. 提交分支(解决冲突): svn ci -m "log message"
  5. 合并分支到主干: svn merge branch master
  6. 删除分支:svn rm branch

 

各环节SVN基本命令

1、获取代码(更新代码)

第一次从仓库里获取代码

$ svn checkout [your_repository_url]
或者
$ svn co [your_repository_url]

如果已有本地代码,则需要更新代码,确保在最新代码上开发

$ cd [your_local_codes_path]
$ svn update
或者
$ svn up

 

2、新建分支

SVN仓库中,trunk主干一般存放开发中的最新线上代码,因此不应该在主干下修改代码。

合理的做法是:从trunk主干拉出一个feature开发分支,然后在该feature分支下修改代码,直到测试通过后把分支feature合并到trunk主干。

 

建立分支

$ svn copy [your_trunk_url] [your_feature_branch_url] -m [your_log]    // -m 填写建立分支的日志

 

切换分支

从trunk分支切换到feature分支

$ svn switch [your_feature_branch_url]

 

3、查看分支

切换分支后就可以进行代码修改。修改一段时间后,如果想了解当前分支文件的状态,可以通过以下命令:

$ svn status

该命令显示的格式为:状态 文件,常见的状态有:

字符 状态 说明
A 添加 与上一版相比增加的文件
C 冲突 该文件冲突
D 删除 该文件已从仓库删除,以后SVN不再跟踪版本
M 修改 该文件被修改过
S 处于其他分支 当前分支的子路径处于其他分支
? 未纳入版本管理 通常是新增文件,SVN还没跟踪该文件的版本。可以使用svn add把文件加入SVN,此时再运行svn status时,文件的状态就显示为A
! 文件缺失 SVN找不到该文件。一般出现在没有使用SVN命令删除文件的情况。当需要从仓库删除某文件时,应该使用svn delete,这样文件的状态就变为D,提交以后该文件的版本就不再被跟踪

4、提交分支 (解决冲突)

开发完成后向远程分支提交代码

$ svn commit -m [your_log]

一般情况下代码就提交到远程分支了,但是如果有人和你修改了同一段代码,并且先提交到了远程分支,就会导致本次提交失败,此时需要先解决冲突再提交代码。

 

解决冲突

更新代码,显示冲突

$ svn update
$ Conflict discovered in [your file]
  Select: (p) postpone, (df) diff-full, (e) edit,
  (mc) mine-conflict, (tf) theirs-conflict,
  (s) show all options:

冲突符号说明:

符号 说明
p 标记冲突,暂不处理
df 显示所有冲突
e 编辑冲突
mc 冲突以本地文件为准
tf 冲突以远程仓库为准
s 显示所有选项

一般先输入df命令看冲突是否严重,如果不严重则通过e直接编辑,编辑页面通常为

<<<<<<< .mine
[your_version]
=======
[their_version]
>>>>>>> [version]

<<<<<<< .mine 和 >>>>>>> [version]之间解决冲突,.mine 是自己修改后的代码,version是别人提交的最新代码,然后保存。

回到Select界面,此时会多出一个(r) resolve的命令。输入r通知SVN已解决冲突。

 

使用postpone解决冲突

如果冲突很严重,需要和提交者讨论解决,可以输入p标记,此时输入svn status显示:

 C [your_file]
 ? [your_file].working
 ? [your_file].merge-left.[version]
 ? [your_file].merge-right.[version]

冲突文件说明:

文件 说明
[your_file] 所有冲突标记在该文件
[your_file].working 当前工作副本
[your_file].merge-left.[version] 产生冲突前基础版本
[your_file].merge-right.[version] 仓库里的最新版本

用以下命令解决冲突

$ svn resolve --accept [base | working | mine-conflict | theirs-conflict | mine-full | theirs-full] [conflicting file] 

示例:svn resolve --accept=working readme.txt

参数 说明
base 将[your_file].merge-left.[version]做为最终结果
working 把[your_file]解决冲突后的结果做为最终结果
mine-conflict 将[your_file].working做为最终结果
theirs-conflict 将[your_file].merge-right.[version]做为最终结果
mine-full 将所有[your_file].working做为最终结果
theirs-full 将所有[your_file].merge-right.[version]做为最终结果

解决冲突后,文件状态变为M,这时再向仓库提交代码即可。

 

5、合并分支

feature分支通过测试后就可以合并到trunk分支。

首先切换到trunk分支,然后执行以下命令

$ svn merge [your_feature_branch_url]

merge还具有回滚的功能:

svn merge -r old:new .

注意不要少最后一个点,这表示把new版本会滚到old版本

顺利的话,feature分支就合并到trunk分支了,但是如果有别人和你修改了同一段代码并且提交到trunk分支就可能再次出现冲突。同样先解决冲突再提交。

6、删除分支

完成功能开发,合并到trunk后,删除feature分支

$ svn delete [your_feature_branch_url] -m [your_log]

 

结束

以上就是开发过程中常用的SVN命令,当然SVN的命令是非常丰富的,想要更强大的功能可以通过svn help来进一步学习。

# svn help
usage: svn <subcommand> [options] [args]
Subversion command-line client.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules,
     'svn --version --verbose' to see dependency versions as well,
     'svn --version --quiet' to see just the version number.

Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.

Available subcommands:
   add
   auth
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   patch
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   relocate
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)
   upgrade

Subversion is a tool for version control.
For additional information, see http://subversion.apache.org/

 

 

参考推荐

SVN 常用命令

CentOS 搭建 SVN Server

SVN 代码正确提交方法

SVN 提交部分文件和文件夹

SVN ignore 忽略文件及目录

Linux(Ubuntu)下保存SVN账户密码

svn代码量统计工具

git/svn reset/revert 回滚到服务器上的某一个版本