Iinux下SVN解决冲突步骤及SVN相关命令操作


进入项目组,进行代码版本维护,要学会相关管理软件的操作及发生冲突时的处理方式,以下以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. 打开冲突文件,手动编辑
  2. 移除冲突标记(<<<<<<<, ========,>>>>>>>>)
  3. 确保文件内容是想要的合并结果
1.3.2 方法2——使用SVN提供的工具
  1. 全部按照我的版本来解决

svn resolve --accept mine-full XXX.ext

  1. 全部按照他人版本来解决

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 命令

checkoutco

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 注意事项

  1. 如果不带–password参数传输密码的话,会提示输入密码,建议不要用明文的–password选项。推荐使用示例c、d,其执行之后会提示输入密码

  2. 其中username 与password前是两个短线,不是一个。

  3. 若不指定本地目录全路径,则检出到当前目录下。

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中保留了本地版本的原始拷贝.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值