8)解决冲突
冲突分为两种:文件冲突---当两名(或更多)开发人员修改了同一个文件中相邻或相同的行时就会发生文件冲突。下面的属性冲突应该也属于文件冲突。 树冲突---当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。
先看文件冲突
两个开发人员改变文件中相同的行时,就会发生文件冲突,Subversion会把解决冲突的任务留给开发人员。 一个文本文件中冲突的区域会标识如下:
<<<<<<< filename
your changes
=======
code merged from repository
>>>>>>> revision
而且对于每个发生冲突的文件,Subversion会生成三个额外的文件在相同的目录下:
文件名.扩展名.mine---这是你的文件,在你更新你的工作副本之前存在于你的的工作副本中——也就是说,没有冲突标志。这个文件除了你的最新修改外没有别的东西。
文件名.扩展名.r旧版本---这是在你更新你的工作副本之前的基础版本(BASE revision)文件。也就是说,它是在你做最后修改之前所检出的文件。
文件名.扩展名.r新版本---这个文件是当你更新你的工作副本时,你的 Subversion 客户端从服务器接收到的。这个文件对应于版本库中的最新版本。
你可以或者启动一个外部合并工具,冲突编辑器,使用TortoiseSVN→ Edit Conflicts菜单命令,或者使用任何文字编辑器来手动解决冲突。 你使用应该决定代码应该如何,做相应的修改然后保存文件。 使用像TortoiseMerge这样或其他比较流行的工具可能是比较容易的选择因为他们户籍重现三栏视图而不是冲突标记。 如果你使用文字编辑器那你就要搜索相关的冲突行。
然后,执行命令 TortoiseSVN → 已解决 并提交人的修改到版本库。需要注意的是已解决命令并不是真正的解决了冲突,它只是删除了文件 文件名.扩展名.mine 和 文件名.扩展名.r*,允许你提交修改。如果你的二进制文件有冲突,Subversion不会试图合并文件。本地文件保持不变(完全是你最后修改时的样子),但你会看到文件名.扩展名.r*文件。如果你要撤消你的修改,保留版本库中的版本,请使用SVN 还原(Revert)命令。如果你要保持你的版本覆盖版本库中的版本,使用已解决命令,然后提交你的版本。
你可以右击父文件夹,选择TortoiseSVN → 已解决...,使用“已解决”命令来解决多个文件。这个操作会出现一个对话框,列出文件夹下所有有冲突的文件,你可以选择将哪些标记成已解决。
属性冲突
当两名或更多的开发人员修改了某个文件的属性时就会发生属性冲突。属性作为文件的一部分,解决属性冲突只能由开发人员来完成。如果一个更改必须被另一个覆盖,那么就在 使用本地属性解决 和 使用远程属性解决 中选择一个。如果更改想要被合并,那就选择 手工编辑属性,选出所要的属性值然后标记为已解决。
树冲突
当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。有很多种不同的情形可以导致树冲突,而且不同的情形需要不同的步骤来解决冲突。书冲突的情形有很多种,最好还是看帮助文档来获得相应的知识,这里略过。
9)图标重载
TortoiseSVN 加入了被称为重载图标的功能重载了原始的文件图标。根据文件的 Subversion 状态的不同,重载的图标也不同。
一个新检出的工作副本使用绿色的对勾做重载。表示 Subversion 状态正常.
在你开始编辑一个文件后,状态就变成了已修改,而图标重载变成了红色感叹号。通过这种方式,你可以很容易地看出哪些文件从你上次更新工作副本后被修改过,需要被提交。
如果你给一个文件设置了svn:needs-lock属性,Subversion 会让此文件只读,直到你获得文件锁。具有这个重载图标的文件来表示你必须在编辑之前先得到锁。
如果你拥有了一个文件的锁,并且 Subversion 状态是正常,这个重载图标就提醒你如果不使用该文件的话应该释放锁,允许别人提交对该文件的修改。
这个图标表示当前文件夹下的某些文件或文件夹已经被调度从版本控制中删除,或是该文件夹下某个受版本控制的文件丢失了。