svn resolved 解决冲突

描述:

svn resolved              — 删除工作拷贝文件或目录的“冲突”状态。

删除工作拷贝文件或目录的“conflicted”状态。这个程序不是语义上的改变冲突标志,它只是删除冲突相关的人造文件,从而重新允许路径提交;也就是说,它告诉Subversion冲突已经“解决了”。关于解决冲突更深入的考虑可以查看“解决冲突(合并别人的修改)”一节。

用法:



句法 (Syntax)

svn resolved PATH...
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交

例子:

1、如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件

句法 (Syntax)

$ svn update
C  rocschool.php
Updated to revision 31.
$ ls
rocschool.php
rocschool.php.mine
rocschool.php.r30
rocschool.php.r31

当你解决了rocschool.php的冲突,并且准备提交,运行svn resolved让你的工作拷贝知道你已经完成了所有事情。

你可以仅仅删除冲突的文件并且提交,但是svn resolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。

2、使用如下命令解决冲突

句法 (Syntax)

svn resolve index.html

3、手工编辑修复,而不是命令解决冲突,需要执行如下命令通知SVN服务

句法 (Syntax)

svn resolved index.html

注意一个是加了字母d,表示已解决(完成时)

4、文件被删除了, 不再需要了

这种情况就很好处理, 使用相关SVN命令将其删了就可以了.

4.1、服务端modified, 本地missing, 该文件不要了. 这种情况本地不会存在该文件, 直接调用resolve就可以了.

句法 (Syntax)

#标记冲突已解决(使用本地的状态, 本地该文件的状态是Delete, 提交后服务端对应的文件就会被删除)
svn resolve --accept=working file_old.php

4.2、本地modified, 服务端missing, 该文件不要了. 这种情况本地存在改文件, 所以强制删掉本地的, 再调用resolve

句法 (Syntax)

#强制删除本地的文件(发生的文件不加--force是删不掉的)
svn delete --force file_old.php
#标记冲突已解决(使用服务器状态)
svn resolve --accept=theirs-conflict file_old.php
#或者使用本地状态也可以, 应该本地的状态跟服务一致了(都是Delete)
svn resolve --accept=working file_old.php

5、文件被删除了, 但是还需要

这种情况可能是由于文件被不小心删除了, 重新加回svn就可以了.

5.1、服务端modified, 本地missing, 选择their conflict就可以了

句法 (Syntax)

svn resolve --accept=theirs-conflict file.php

5.2、本地modified, 服务端missing

句法 (Syntax)

svn resolve --accept=working file.php

6、文件被移走或重命名了

这种情况的具体场景是A端修改了某文件, B端移动或重命名(简称改路径)了该文件. 这种情况需要分两步处理, 分别是文件内容冲突处理和目录结构冲突处理.

为了方便描述, 我们把A端修改的文件成为旧文件, B端改路径的文件称为新文件. 我们最终要的是新文件还是旧文件, 在处理时只有细微的区别, 所以我们这里假定我们要的时新文件.

由于B端改路径之后还可能又做了修改, 下面我们就有无修改分成两种情况来处理.

6.1、文件改路径后无修改. 这个情况很好处理, 只要把A端的修改重做一遍就可以, 具体做法是, 将A端的修改做成一个补丁, 再将补丁应用于新文件上。

假设本地是A端(修改了文件--bar.c), 服务端是B端(转移了文件->baz.c). 内容处理:

句法 (Syntax)

svn diff bar.c > PATCHFILE  #创建补丁文件
vi PATCHFILE  #编辑补丁文件
...
---bar.c    (working copy)  #将这行的bar.c改成baz.c
+++bar.c    (working copy)  #将这行的bar.c也改成baz.c
...
svn patch PATCHFILE .    #应用补丁到当前目录(补丁只能应用到目录)

结构处理:

句法 (Syntax)

svn delete --force bar.c    #将已经missing的文件状态改为D
svn resolve --accept=working bar.c    #标记已解决(此处也可用theirs-conflict)

假如服务端是A端修改了文件, 本地是B端转移了文件, 创建补丁的方法有细微的区别 内容处理:

句法 (Syntax)

svn info bar.c #先使用svn info查看详情
Tree conflict: local file moved away, incoming file edit upon update
  Source  left: (file) bar.c@1485
  Source right: (file) bar.c@1486
svn diff -r1485:1486 bar.c > PATCHFILE  #根据详情创建补丁文件
vi PATCHFILE  #编辑补丁文件
...
---bar.c    (working copy)  #将这行的bar.c改成baz.c
+++bar.c    (working copy)  #将这行的bar.c也改成baz.c
...
svn patch PATCHFILE .    #应用补丁到当前目录(补丁只能应用到目录)

结构处理:

句法 (Syntax)

svn resolve --accept=working bar.c   #标记已解决

6.2、文件改路径后有修改. 这种情况目录结构冲突处理跟上面类似, 这里就不再累述了, 但是的文件内容冲突处理比较麻烦, 目前还没有找到自动合并的方法, 需要手动合并, 这里只能是给点建议, 建议是先用svn diff 查看就旧文件的改动作为索引:

句法 (Syntax)

svn info bar.c #找到旧文件变化的版本
Tree conflict: local file moved away, incoming file edit upon update
  Source  left: (file) bar.c@1485
  Source right: (file) bar.c@1486
svn diff -r1485:1486 bar.c #查看变化的内容
Index: bar.c
===================================================================
--- bar.c   (revision 1485)
+++ bar.c   (revision 1486)
@@ -3,4 +3,5 @@
void main()
{
printf("hello")
+printf("world")
}

之后, 在用图形界面工具(如beyond compare)比对旧文件与新文件, 将svn diff里的变更点一个一个手动应用到新文件。


来源:https://www.jianshu.com/p/e3cc83ca512d、其它网络收集

  • 使用社交账号登录,本站支持
全部评论(0)