前言:

最近在开发的时候,由于需求太多,开发周期长短不一,从主线上切了多个分支(一般不在主线trunk上开发,万一线上出问题可及时修改代码上线),在部分功能上线后,想把代码同步到新的分支上去,最开始的想法是人工去合并代码,把两个分支down下来把修改的文件比较并进行合并,然后最后提交;但是文件修改的很多很杂,人工去合并肯定出现误差,比如代码合并少了;其实这些都是可以通过svn工具进行处理的,于是回顾了下开发过程中经常用到的svn功能。

svn有客户端和服务端两个,我们一般开发的时候,不会涉及到服务端svn的管理,服务端一般是配管来进行管理的。

我们平时开发接触到的都是svn的客户端tortoise svn,还有开发工具eclipse的svn插件.

最常用的svn功能有:检出工程 ,提交文件,更新文件,合并代码 ,show revision graph,切换(切换到历史版本或者是当前最新版本),显示资源历史记录;

在大多数情况下我们使用开发工具的svn插件,方便,但是插件有时候不是很稳定,经常抽风,这时候小乌龟就该上场了。

小乌龟的基本使用:

1,查看资源库内容,右键-tortoiseSvn-repo browser 输入url就可以查看服务器上的代码

2,检出资源的时候,右键-tortoiseSvn-export/svn check out[export和svn check out 是有区别的,export把源码down到本地,然后,然后,就和服务器端的svn没联系了,所以开发的时候建议用check out]

3,提交新增文件,右键-tortoiseSvn-Add

4,提交修改文件,右键-tortoiseSvn-commit

5. 比较历史文件,右键-tortoiseSvn-diff with previous version

6. 把文件切换到历史一个版本 ,在文件右键-tortoiseSvn-switch

使用中常见问题总结:

1,代码冲突如何解决?

冲突原因: A 、 B 两个用户都在版本号为 1 的时候,更新了1.txt 这个文件, A 用户在修改完成之后提交1.txt 到服务器,这个时候提交成功,这个时候 1.txt 文件的版本号已经变成 2 了。同时 B 用户在版本号为 1 的1.txt 文件上作修改,修改完成之后提交到服务器时,由于不是在当前最新的 2 版本上作的修改,所以导致提交失败。

版本冲突现象:冲突发生时, subversion 会在当前工作目录中保存所有的目标文件版本 [ 上次更新版本、当前获取的版本 ( 即别人提交的版本 ) 、自己更新的版本、目标文件 ] 。假设文件名是 1.txt

对应的文件名分别是:1.txt.r101,1.txt.r102,1.txt.mine,1.txt 。同时在目标文件中标记来自不同用户的更改。

 解决冲突有三种选择

A 、放弃自己的更新,使用 svn revert (回滚),然后提交。在这种方式下不需要使用 svn resolved (解决)

B 、放弃自己的更新,使用别人的更新。使用最新获取的版本覆盖目标文件,执行 resolved filename 并提交 ( 选择文件 — 右键 — 解决 ) 。

C 、手动解决:冲突发生时,通过和其他用户沟通之后,手动更新目标文件。然后执行 resolved filename 来解除冲突,最后提交。(这种方式比较多用)

   使用tortoiseSvn解决冲突图形方法:

在冲突的文件上(选中文件 -- 右键菜单 —TortoiseSVN—Edit conflicts (解决冲突)),Theirs 窗口为服务器上当前最新版本,Mine 窗口为本地修改后的版本,Merged 窗口为合并后的文件内容显示 ;

修改完成后,保存 1.txt 文件内容;

在冲突目录下,选中文件 -- 右键菜单 —TortoiseSVN—Resolved (解决)。会列出冲突的文件列表,如果确认已经解决,点 OK ;

提交解决冲突后的文件。

命令行操作 :

      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

  5.使用1.txt.mine作为最后提交的版本 

    $ svn resolve –accept theirs-conflict 1.txt  

resolve: 解决工作副本中目录或文件的冲突。
用法: resolve --accept=ARG [PATH...] 注意: 当前需要选项 --accept 。 有效选项:
--targets ARG : 传递文件 ARG 内容为附件参数
-R [--recursive] : 向下递归,与 --depth=infinity 相同
--depth ARG : 受深度参数 ARG(“empty”,“files”,“immediates”,或“infinity”) 约束的操作
-q [--quiet] : 不打印信息,或只打印概要信息
--accept ARG : 指定自动解决冲突动作的源
('base', 'working', 'mine-conflict',
'theirs-conflict', 'mine-full', 'theirs-full') 全局选项:
--username ARG : 指定用户名称 ARG
--password ARG : 指定密码 ARG
--no-auth-cache : 不要缓存用户认证令牌
--non-interactive : 不要交互提示
--trust-server-cert : 不提示的接受未知的 SSL 服务器证书(只用于选项 “--non-interactive”)
--config-dir ARG : 从目录 ARG 读取用户配置文件
--config-option ARG : 以下属格式设置用户配置选项:
FILE:SECTION:OPTION=[VALUE]
例如:
servers:global:http-library=serf

2TortoiseSVN branch/tag switch Relocate

  Switch是转换当前工作副本对应的工作目录,一般是从trunk工作目录转向tag工作目录,或者从tag转回来,switch的类似update,将switch的目标工作目录的文件更新到本地,一般会产生很多冲突。【像在前言提到的需要合并或切换的分支的时候,就可以用此功能】

  Relocate是当代码仓库的访问路径(服务器的计算机名称修改,或IP地址变更,URL变更),而此时已检出修改的工作副本(working copy)没有变更,若此时直接提交(commit),肯定不能成功,因为此提交地址对应的svn服务器不存在了。TortoiseSVN为我们提供了重定位工作副本的功能(TortoiseSVN → Relocate),此指令扫描.svn文件夹中的所有条目,改变条目的url(服务器地址)为新输入的地址。

  重定位操作可能的原因:

  a) 服务器的IP地址已更改

  b) 协议已更改(比如从http://改为 https://)

  c) 版本库在服务器的路径已更改

3.svn switch的使用(看完merge的功能后,对switch的理解就是切换分支的作用)

     a) 分支内的switch命令使用,右键A文件swith B文件,实际是将 B 的内容更新到了 A。

   b)分支A和B,A本地文件有修改未提交,然后swtih B分支时,若A本地修改文件不会丢失;

分支A和B,A分支有文件修改并已提交,然后switch B分支,此时A分支代码被覆盖,这个时候就相当于update B 文件到A分支,所以慎用!!

分支A和B,A本地文件有修改,B分支同一文件也有修改并已提交,然后swtih B分支时,此时会文件冲突;

分支A和B,B分支有文件修改并已提交,然后swtih B分支时,B分支文件被更新到A;

4.svn创建分支

svn copy -m "1.7.2 - theme" svn://localhost/www/trunk svn://localhost/www/branches/branch
svn co svn://localhost/www/branches/branch

 5.合并代码

     a)从trunk中merge到分支。(如果使用小乌龟选择第一项)

#前面的1是开分支之前trunk的版本号,后面的2是merge时trunk的版本号
svn merge -r 1:2svn://localhost/www/trunk

b)从分支merge到trunk。(如果使用小乌龟选择第二项)

#先从trunk checkout一份新鲜的代码,然后cd到该版本目录下
svn co svn://localhost/www/trunk
cd trunk
#12973是分支开始的版本号,13006是分支结束的版本号
svn merge -r 12973:13006 svn://localhost/www/branches/branch

c)分支合并(小乌龟第三项)

合并的时候,一定配上起始版本号

终上所述:前言部分所遇到的问题,应该已经有比较好的解决方法,有效的使用svn工具会为我们的开发效率带来很大的提升。

备注:很好的一份svn使用手册http://www.bsdmap.com/manuals/subversion/index.html

svn工具的使用问题总结的更多相关文章

  1. SVN工具的使用 和在Eclipse中安装GPD插件:(多步审批流,因此选择使用工作流(JBPM)来实现)

    前言 重点解说SVN工具的还原版本号.   1.提交svn之前.要先更新文件.假设更新之后有版本号冲突的话.就线下解决掉冲突,在把该文件标记为已经解决冲突. 正文 使用SVN还原历史版本号 water ...

  2. svn上check下来的项目,用idea打开,菜单栏没有svn工具解决办法

    1.用idea打开你的项目(idea已经配置过小乌龟了) 2.菜单栏点击VCS,Enable Version Control Integration... 3.选择Subversion 4.这时候,菜 ...

  3. Mac 10.12安装SVN工具SmartSVM 7.6

    说明:SVN工具没有最好的,只有用的最顺手的. 下载: (链接: https://pan.baidu.com/s/1dFGqEsT 密码: uyjx)

  4. Mac端SVN工具CornerStone详解

    俗话说:"工欲善其事必先利其器": 对于我们程序员来说,不管你是大神,还是小鱼小虾,进入公司之后,都用过源码管理工具,不然你就不是一个合格的程序员,现在各个公司用于源码管理工具通常 ...

  5. iOS开发之--svn工具Cornerstone上传忽略.a文件的处理方法

    工程文件上传到svn中,.a文件会自动屏蔽(应该叫屏蔽,反正就是上传不上去) 用Cornerstone工具,解决这个问题 1.打开Cornerstone左上角,点Cornerstone->Pre ...

  6. Eclipse下使用Subversion(SVN工具)

    本文目的 让未使用过版本控制器软件或者未使用过subversion软件的人员尽快上手. subversion的使用技巧很多,这里只总结了最小使用集,即主要的基本功能,能够用来应付日常工作. 因此不涉及 ...

  7. ※版本管理※=>☆SVN工具=>※解决地域麻烦※№→搭建自己的网络SVN (SourceForge 免费) [转]

    源文 http://blog.csdn.net/xiaoting451292510/article/details/8562570 分类: 版本管理 2013-02-01 14:44 26057人阅读 ...

  8. SVN工具常用功能总结

    使用SVN作为版本管理工具,可以使用VisualSVN Server+TortoiseSVN搭建SVN版本控制系统,组长安装VisualSVN Server,组员安装TortoiseSVN. Tort ...

  9. svn工具安装下载Tomcat源码以及导入eclipse

    安装 1.svn下载地址 https://tortoisesvn.net/downloads.html 2.语言包下载 3.先安装svn,在直接安装语言包 4.桌面右键可以看到相关svn信息 下载To ...

随机推荐

  1. Linux下使用vim编辑C程序

    这几天在系统能力班自学linux,加上最近大数据课上开始使用linux,我在这里总结一下,linux下使用vim编辑c程序的一些问题. 大数据课上是直接使用micro来编辑的,我这里只是简单的说明一下 ...

  2. 第一次作业(homework-01)成绩公布

    已收到博客名.github名的同学得分列表: 学号后三位 成绩(0-10) 215 8082 0132 5184 5027 7194 9.5157 7074 8195 6222 8158 6128 8 ...

  3. 20181120-4 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 01

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2409 版本控制地址   https://git.coding.net/lg ...

  4. 博弈---威佐夫博奕(Wythoff Game)

    这个写的不错 威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同 时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.     这种情况下是颇为复杂 ...

  5. HDU 5200 Trees 二分

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5200 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

  6. nginx 几个常用的标准模块介绍

    ngx_http_ssl_module(https) 1:指明是否启用的虚拟主机的ssl功能 ssl on | off; 2:指明虚拟主机使用的证书文件 ssl_certificate /usr/lo ...

  7. spring复杂数据类型传递

    1.VO对象与PO对象的区别: PO(persistant object) 持久对象:通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库中的表相映射的java对象.最简单的PO ...

  8. testng几种写法

    testng几种写法: 1 <!--运行-类--> 2 <?xml version="1.0" encoding="UTF-8"?> 3 ...

  9. python接口自动化测试框架实现之字符串插入变量(字符串参数化)

    问题: 在做接口自动化测试的时候,请求报文是json串,但是根据项目规则必须转换成字符串,然后在开头拼接“data=” 接口中很多入参值需要进行参数化. 解决方案: 1.Python并没有对在字符串中 ...

  10. vue-cli3使用 DllPlugin 实现预编译,提升构建速度

    在项目打包上有两个目标:减少打包代码体积和加快打包速度 1. 减少打包体积: (1)对于用的比较少的库,可以去掉(我去掉了jquery以及lodash),用到的地方,参考源码自己写 (2)非用不可的又 ...