文章目录
进入项目组,进行代码版本维护,要学会相关管理软件的操作及发生冲突时的处理方式,以下以TortoiseSVN为例
参考https://blog.csdn.net/bravezhe/article/details/7396151
https://www.cnblogs.com/liuxiaowei/p/8297268.html
一、SVN解决冲突步骤
1. 简略步骤(若不清晰,可以结合2举例参考)
1.1 更新本地副本
svn update
1.2 查看冲突状态
svn status 路径\文件名
冲突文件通常会显示为C
(冲突状态)
1.3 解决冲突
SVN在出现冲突时,会创建以下几个文件:
- XXX.ext: 你的本地版本。
- XXX.ext.rOLDREV:所有更新前的最基础、未导致冲突版本。
- XXX.ext.rNEWREV:其他人提交后的版本,即导致冲突的版本。
1.3.1 方法1——手动解决冲突
- 打开冲突文件,手动编辑
- 移除冲突标记(
<<<<<<<
,========
,>>>>>>>>
) - 确保文件内容是想要的合并结果
1.3.2 方法2——使用SVN提供的工具
- 全部按照我的版本来解决
svn resolve --accept mine-full XXX.ext
- 全部按照他人版本来解决
svn resolve --accept theirs-full XXX.ext
1.4 标记冲突已解决
svn resolve --accept working XXX.ext
1.5 提交更改
svn commit -m "提交注释" XXX.ext
2. 举例
工程师A修改了a.txt的第一行,提交了。
你是工程师B,也修改了a.txt的第一行,然后执行svn up,SVN提示:
$ svn up
在 “a.txt” 中发现冲突。 选择: (p) 推迟,(df) 显示全部差异,(e) 编辑, (mc) 我的版本, (tc) 他人的版本, (s) 显示全部选项
一般选择p(推迟),即引入冲突到本地,不过不会影响到SVN服务器端,可以放心。
<<<<<开始解决冲突>>>>>
这时,会生成几个文件:
a.txt
a.txt.mine
a.txt.r6328
a.txt.r6336
a.txt
中包含了工程师A、B的所有修改,以<<<<<<<、=======、>>>>>>>
分隔。a.txt.mine
是工程师B的修改,也就是未update前的a.txt。a.txt.r6328
是工程师A提交前的版本,即未导致冲突的版本。a.txt.r6336
是工程师A提交后的版本,即导致冲突的版本。
查看a.txt就可以看到冲突的详情
[yicheng@chengyi svntest]$ cat a.txt
<<<<<<< .mine
i also modify ,agndagnagasdg;
=======
i modify this line;
>>>>>>> .r6336
以上,<<<<<<< .mine
和=======
之间是工程师B(当前的“你”)修改的内容,=======
与>>>>>>> .r6336
之间是工程师A修改的内容。这时,最好的办法是,叫上工程师A,你们一起确定这些修改是否都需要,是否相互兼容,然后留下需要的部分,删 除<<<<<<< .mine
、=======
和>>>>>>> .r6336
。
<<<<< 提 交 >>>>>
测试,测试!确定没问题之后,就可以告诉SVN,你解决冲突了:
svn resolve –accept working a.txt (该命令会删除a.txt.mine a.txt.r6328 a.txt.r6336)
svn ci -m ’some comment’ a.txt
- 需要注意的是,
a.txt.mine
a.txt.r6328
a.txt.r6336
这几个文件的存在代表着有冲突产生。 - 如果不解决冲突,就手工删除它们,SVN服务器也会很傻的认为你解决了冲突,允许你继续之后 的工作。
- 但是,冲突依旧存在,你的
a.txt
中不但有别人的修改,还有那些讨厌的<=>
符号。
在冲突未解决前,试图提交代码是肯定会失败的:
$ svn ci -m ""
svn: 提交失败(细节如下):
svn: 提交终止: “/path/to/svntest/a.txt” 处于冲突状态
在使用svn update 的时候,会出现如下一些信息:
$ svn update
U INSTALL
G README
C bar.c
Updated to revision 46.
- U 开头的信息提示你,这个文件在你本地没有修改过,文件已经根据版本库的新版本更新了。
- G 开头的信息提示你,这个文件在你本地已经修改过,但是和版本库中对应的版本并没有冲突的地方,svn已经合并更新了。
- C 开头的信息提示你,这个文件有点麻烦,你在本地的修改和版本库中的版本修改的地方重叠了,也就是说,你修改了某一行,你的同事也修改了同一行。这个就需要你自己手工去解决了。
二、命令使用指南
1. 将文件checkout到本地目录
1.1 命令
checkout
或co
1.2 示例
I、svn co http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名–password 密码
II、svn co svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名–password 密码
III、svn checkout http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
IV、svn checkout svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
1.3 注意事项
-
如果不带–password参数传输密码的话,会提示输入密码,建议不要用明文的–password选项。推荐使用示例c、d,其执行之后会提示输入密码
-
其中username 与password前是两个短线,不是一个。
-
若不指定本地目录全路径,则检出到当前目录下。
2. 添加新文件
2.1 命令
svn add 文件名
注:告诉SVN服务器要添加文件了,还要用svncommint -m真实的上传上去!
2.2 示例
I、svnadd test.c <-添加test.c
svn commint -m “添加测试用test.c“test.php
II、svnadd .c <-添加当前目录下所有的c文件
svn commint -m“添加测试用全部c文件“.c
3. 导出(导出一个干净的不带.svn文件夹的目录)
svn export
svn export [-r 版本号] http://路径(目录或文件的全路径)[本地目录全路径] --username 用户名
svn export [-r 版本号] svn://路径(目录或文件的全路径)[本地目录全路径] --username 用户名
svn export 本地检出的(即带有.svn文件夹的)目录全路径 要导出的本地目录全路径
4. 将改动的文件提交到版本库
svn commint
svn ci
svn commint -m “提交备注信息文本“ [-N] [–no-unlock] 文件名
svn ci -m “提交备注信息文本“ [-N] [–no-unlock] 文件名
svn commit -m"LogMessage" [-N] [–no-unlock]PATH(如果选择了保持锁,就使用–no-unlock开关)
必须带上-m参数,参数可以为空,但是必须写上-m
5. 更新文件
svn update
svn up
svn update -r 修正版本 文件名
svn update 文件名
6. 删除文件
svn delete
svn del
svn remove
svn rm
svn delete svn://路径(目录或文件的全路径)-m “删除备注信息文本”
推荐如下操作:
svn delete 文件名
svn ci -m “删除备注信息文本”
7. 加锁/解锁
svn lock
svn lock -m “加锁备注信息文本“ [–force] 文件名
svn unlock 文件名
svn lock -m"LockMessage" [–force] PATH
8. 比较差异
svn diff
svn diff 文件名
svn diff -r 修正版本号m:修正版本号n 文件名
svn diffpath(将修改的文件与基础版本比较)
svn diff -r m:npath(对版本m和版本n比较差异)
9. 将两个版本之间的差异合并到当前文件
svn merge
svn merge -r m:n path
10. 查看文件或者目录状态
svn status
svn st
svn st 目录路径/名
svn status 目录路径/名<-目录下的文件和子目录的状态,正常状态不显示
【?:不在svn的控制中; M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
svn -v 目录路径/名
svn status -v 目录路径/名<-显示文件和子目录状态 【第一列保持相同,第二列显示工作版本号, 第三和第四列显示最后一次修改的版本号和修改人】
1)svnstatus path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svnstatus -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人.
注:svnstatus、svndiff和svnrevert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝.