本人使用SVN的时间不是很长,在使用之前也仅仅是粗浅的了解过这个软件。从今年的8月份开始,由于一个项目使用Eclipse 3.1,跨地域的开发,为了适应不同的开发人员处于不同的地理位置,因此我们使用SVN作为团队开发的管理工具。开始使用时,仅仅是边学边用,遇到不懂的地方再去查找资料。今天由于有点时间,先把合并过程遇到的冲突问题详细了解一下。<br /><br /> 可以使用svn status -u命令来查看一下某个问题是否会有冲突发生。在使用svn update 的时候,会出现如下一些信息:<br />$ svn update<br />U INSTALL<br />G README<br />C bar.c<br />Updated to revision 46.<br /><br />那么,U 开头的信息提示你,这个文件在你本地没有修改过,文件已经根据版本库的新版本更新了。G 开头的信息提示你,这个文件在你本地已经修改过,但是和版本库中对应的版本并没有冲突的地方,svn已经合并更新了。而C 开头的信息提示你,这个文件有点麻烦,你在本地的修改和版本库中的版本修改的地方重叠了,也就是说,你修改了某一行,你的同事也修改了同一行。这个就需要你自己手工去解决了。当冲突发生时,要注意到有三件事情可以帮助你解决问题。<br /> a.Subversion会给这个文件作出c标记。<br /> b.如果Subversion认为这个文件时可以合并的,它会一个冲突标记(特殊的横线来分开冲突的代码块)<br /> c.对每一个冲突的文件,Subversion放置三个额外的未版本化文件到你的工作拷贝。<br /><br />filename.mine<br /> 你更新前的文件,没有冲突标志,只是你最新更改的内容。(如果这个文件不可以合并,.mine文件不会创建,因为它和工作文件相同。)<br /><br />filename.rOLDREV<br /> 这个是你做更新操作以前的BASE版本,就是你在上次更新之后未作更改的版本。<br /><br />filename.rNEWREV<br /> 这是Subversion从服务器刚刚收到的版本。这个版本就是版本库的HEAD版本。<br /><br /><br />例如,如果sally修改了一个文件sandwich.txt, 而harry也刚刚修改了这个文件的相同位置并提交到服务器。那么sally在做这个文件的update操作的时候会得到三个额外的文件sandwich.txt.mine、sandwich.txt.r1、sandwich.txt.r2。并且在提交的时候会遭到服务器的拒绝,因为这个文件的冲突问题还没有得到解决。要解决这个冲突,可以选择:<br /> a. 手工合并冲突文件(检查和修改文件中的冲突标志)。<br /> b.用一个临时文件(三个中的一个)覆盖你的工作文件。<br /> c.运行svn revert <filename>来放弃所有的修改。<br /><br />一旦解决了你的冲突,需要通过命令svn resolved让subversion知道并删除三个临时文件。这时才可以提交。<br /><br />下面再说说手工合并冲突。开始的时候让人觉得害怕,但做一段时间之后,就觉得不那么烦人了。<br /><br />看看如下文本:<br />Mayonnaise<br />Lettuce<br />Tomato<br />Provolone<br /><<<<<<< .mine<br />Salami<br />Mortadella<br />Prosciutto<br />=======<br />Sauerkraut<br />Grilled Chicken<br />>>>>>>> .r2<br />Creole Mustard<br /><br /><br />一连串的大于、小于、等于号是冲突标记,这些数据得全部删除才可以提交。其中,<br /> <<<<<<< .mine<br />Salami<br />Mortadella<br />Prosciutto<br />=======<br />是你在冲突区里面做的修改。<br /><br />Sauerkraut<br />Grilled Chicken<br />>>>>>>> .r2<br />是别人在冲突区做的修改。<br /><br />在冲突区中,或许你需要和你的同事沟通来安排冲突区的文本内容,如果是程序代码,你需要和同事商量一下,中间的这段代码到底应该是什么样子的。<br /><br />所有冲突区得到合理的解决之后,你就可以提交你的文件了。
<br>
<br>