树冲突场景
- 同一条分支,有2个Dev在同时编辑一个文件,两人没沟通好:
- 其中一Dev A把一个文件移到另外一个目录或者重命名了,并且已经提交;
- 另一Dev B也同时在修改这个文件内容,并不知道A已经将该文件转移或重命名;
- 冲突出现:当Dev B想提交代码到分支时,会出现不让提交情况。
场景实例
- 初始分支:
xfc 写道
$ svn list -Rv http://xxx.com/branches/boringkiller
61536 fangchen 2月 13 19:32 htdocs/
61536 fangchen 59 2月 13 19:32 htdocs/changeLog.txt
61536 fangchen 2月 13 19:32 htdocs/
61536 fangchen 59 2月 13 19:32 htdocs/changeLog.txt
- Dev A的改动,且提交:
xfc 写道
$ svn st
A htdocs/changlog.txt
D htdocs/changeLog.txt
A htdocs/changlog.txt
D htdocs/changeLog.txt
- Dev B的改动:
xfc 写道
$ svn st
M htdocs/changeLog.txt
M htdocs/changeLog.txt
- 此时Dev B想提交代码,报错:
xfc 写道
$ svn ci -m"xfc ci"
Sending htdocs/changeLog.txt
svn: E155011: Commit failed (details follow):
svn: E155011: File '/home/xfc/works/myDemo/htdocs/changeLog.txt' is out of date
svn: E160013: File not found: transaction '61545-1cqn', path '/misc/avatar/branches/boringkiller/htdocs/changeLog.txt'
Sending htdocs/changeLog.txt
svn: E155011: Commit failed (details follow):
svn: E155011: File '/home/xfc/works/myDemo/htdocs/changeLog.txt' is out of date
svn: E160013: File not found: transaction '61545-1cqn', path '/misc/avatar/branches/boringkiller/htdocs/changeLog.txt'
- svn up后:
xfc 写道
$ svn up
Updating '.':
C htdocs/changeLog.txt
A htdocs/changlog.txt
At revision 61545.
Summary of conflicts:
Tree conflicts: 1
Updating '.':
C htdocs/changeLog.txt
A htdocs/changlog.txt
At revision 61545.
Summary of conflicts:
Tree conflicts: 1
解决办法
- 一方案(以Dev A的版本为准,把Dev B自己的改动合并到Dev A的改动上)
第一步
写道
$ svn diff htdocs/changeLog.txt
Index: htdocs/changeLog.txt
===================================================================
--- htdocs/changeLog.txt (working copy)
+++ htdocs/changeLog.txt (working copy)
@@ -2,3 +2,5 @@
@Author xfc
Tree Conflict Demo.
+
+I'm editing this file.
Index: htdocs/changeLog.txt
===================================================================
--- htdocs/changeLog.txt (working copy)
+++ htdocs/changeLog.txt (working copy)
@@ -2,3 +2,5 @@
@Author xfc
Tree Conflict Demo.
+
+I'm editing this file.
第二步
写道
$ svn diff htdocs/changeLog.txt > replace
第三步,编辑replace文件,替换 “changeLog.txt”为“changelog.txt”
第四步
xfc 写道
$ svn patch replace
U htdocs/changlog.txt
U htdocs/changlog.txt
现在的状态:
写道
$ svn st
M htdocs/changlog.txt
A + C htdocs/changeLog.txt
> local edit, incoming delete upon update
Summary of conflicts:
Tree conflicts: 1
M htdocs/changlog.txt
A + C htdocs/changeLog.txt
> local edit, incoming delete upon update
Summary of conflicts:
Tree conflicts: 1
第五步,删除冲突文件
xfc 写道
svn del --force htdocs/changeLog.txt
D htdocs/changeLog.txt
D htdocs/changeLog.txt
最后:
写道
$ svn st
M htdocs/changlog.txt
M htdocs/changlog.txt
二方案(以Dev B的版本为准,把Dev A对文件的重命名无效)
第一步,删除A的改动:
xfc 写道
$ svn del --force htdocs/changlog.txt
D htdocs/changlog.txt
D htdocs/changlog.txt
第二步,接受本地working的改动
xfc 写道
svn resolve --accept=working htdocs/changeLog.txt
Resolved conflicted state of 'htdocs/changeLog.txt'
Resolved conflicted state of 'htdocs/changeLog.txt'
看本地改动是否生效:
xfc 写道
svn diff
Index: htdocs/changlog.txt
===================================================================
--- htdocs/changlog.txt (revision 61559)
+++ htdocs/changlog.txt (working copy)
@@ -1,5 +0,0 @@
-Boring Killer Change Log:
-@Author xfc
-
-Tree Conflict Demo.
-
Index: htdocs/changeLog.txt
===================================================================
--- htdocs/changeLog.txt (working copy)
+++ htdocs/changeLog.txt (working copy)
@@ -3,3 +3,4 @@
Tree Conflict Demo.
+I'm editing my file.
Index: htdocs/changlog.txt
===================================================================
--- htdocs/changlog.txt (revision 61559)
+++ htdocs/changlog.txt (working copy)
@@ -1,5 +0,0 @@
-Boring Killer Change Log:
-@Author xfc
-
-Tree Conflict Demo.
-
Index: htdocs/changeLog.txt
===================================================================
--- htdocs/changeLog.txt (working copy)
+++ htdocs/changeLog.txt (working copy)
@@ -3,3 +3,4 @@
Tree Conflict Demo.
+I'm editing my file.
完毕,ci了~
参考资料
总结:
使用到的svn一些没接触过的命令
- svn patch
- svn del --force filepath
- svn resolve --accept=working filepath