步遥情感网
您的当前位置:首页【SVN】Iinux下SVN解决冲突步骤及SVN相关命令操作

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

来源:步遥情感网


一、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提供的工具
  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 示例

1.3 注意事项

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

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

2. 添加新文件

2.1 命令

svn add 文件名

:告诉SVN服务器要添加文件了,还要用svncommint -m真实的上传上去!

2.2 示例

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

svn export

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

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

因篇幅问题不能全部显示,请点此查看更多更全内容