工作必备基础 - 冲突来了

  • 作者:KK

  • 发表日期:2015.12.27


在使用SVN的过程中,发生冲突是时有的事情,这里并不是说小明跟小红又在床头吵架打架了而是指文件内容之间发生了冲突,而往往新手会在这方面显得手忙脚乱不知如何是好,学会这一章你就不怕了

引发冲突

先确保小明和小红都已经更新了a.js并且没有红色叹号,学习本章节之前,a.js文件内容以下面这个为基准:

var id = 123;
var email = 'xiaohong@xx.com.cn';
alert('Hello world!');
var name = 'xiaoming';

把小明的

alert('Hello world!');

修改成如下,并提交到仓库

alert('欢迎兄弟们来我家喝酒看球赛!');

然后把小红的

alert('Hello world!');

修改成如下,但不要提交

alert('不欢迎啊不欢迎!');

更新小红的代码

好了,冲突就这样发生了,小红当然很生气啊.不过管她生不生气呢,还有你啊,先别关闭更新窗口!

小明说要欢迎喝酒,小红又说不欢迎,到底要怎样呀,电脑不可能那么智能可以自动设置要小明或自动要小红的吧.

假设这是很长的程序功能代码,如果直接把小明的代码覆盖掉小红的,那小红辛苦编写的东西不就被他抹掉了吗?


查看冲突

我上面提醒过你了,别关掉更新窗口

我们右键那个窗口的更新文件选择编辑冲突,会出来一个"三视图"编辑界面,分别是上面的左右两边各一个,下面一个

  • 视图介绍

    左上角视图是指版本仓库里的代码样子,红色背景那一行是跟你本地代码发生冲突的代码行

    右上角视图是指本地文件里的代码样子,红色背景那一行是跟代码仓库文件发生冲突的代码行

    下面的视力是指你最终需要的结果,保存时就用这个保存到你的文件里了

其中你看我图中圈了三个地方,分别都是行号,这个是冲突编辑器,它意在问你:"仓库的代码第3行说要这个字符串,你的代码第3行说要那个字符串,那如果你选择的话第3行到底要哪个字符串?"

所以你能发现底下那个视力的第3行有一堆问号是吧,就是还不确定到底用谁的第3行,之所以发生冲突,最简单就是两个人都同时修改了同一行代码的相同位置,OK这时先别关闭这个冲突编辑器

另外你看看文件夹里,有没有发现多出了以下三个文件

关于这三个文件我就不在这多说它们,你只要知道,它们对于项目来说不是什么有用的文件,不要添加到你的程序里.因为一旦发生冲突就会产生类似这样的文件,但如果你依照SVN提供的菜单来处理冲突,它们会自动消失


解决冲突

要解决冲突,一般都要两个人进行沟通,在工作中我们有时是两个人面对面聊代码,沟通出结果后

此时小红觉得自己的提示语句不是很好,感觉阻碍了小明的社交事业是吧,于是决定采用小明的,所以她对小明的红色背景那第3行代码点击鼠标右键选择使用此文本块,然后下面第3个视力的第3行那堆问号消失了,变成了小明的代码

此时证明冲突编辑器在第3行的代码问题上已经是没有疑问的了,所以就没了那些问号咯.接下来点击冲突编辑器左上角的保存按钮,如下图,它弹出这个东西意思是说:"你这个文件已经没有冲突了,要不要标记为已解决?"你点击标记为已解决吧

为什么要标记为已解决?其实冲突发生的时候多出来的a.js.minea.js.r6那些文件就是"a.js 存在冲突的标记",此时小红已经愿意放弃自己的代码使用小明的,于是没有冲突分歧了,需要将文件标记为"冲突已解决"的状态才行,怎么标记呢,上面的菜单操作就是其中一种方式,在此操作后,你会发现文件夹里的a.js.minea.js.r6那些文件已经消失不见了

这是冲突的认识和解决冲突的基础,我也不是全部都讲到的,比如那些"使用整个文件",和"先使用我的文件块"这些菜单我也没教你用

但我想你学会上面的内容后,作为一个正常人是可以举一反三,自己判断的,因为其实无论这些菜单有多少,怎么用,重点是你明白了这些问题的概念之后,就知道用什么菜单能解决这些问题了,对吧?


注意多个冲突

而另外通常冲突会的不止一行代码,所以编辑冲突时,不要以为修正一个冲突位置就没事了,要看看还有没有别处存在冲突,比如下图,我这回让小明和小红都同时修改了两个地方的代码,冲突编辑器显示如下

下面第三视图有两行问号嘛,有多少行问号就是有多少个冲突咯,如果你用鼠标点击一下左上视图的显示蓝色 +1 的那一行,那么你的冲突编辑焦点就在第1个冲突里,编辑器上面有一个红色的按钮菜单叫下一处冲突点击它可以将编辑焦点跳到下一个冲突,如果点击其它视力中的也是这样的,反正如果你发现前一处冲突或者下一处冲突这两个菜单按钮不是灰色的话,说明还有冲突

实际工作中的代码会起码有几百行左右,第一处冲突可能在前10行,但第二处冲突可能在400几行,你一个屏幕显示不完的,所以你必须注意前一处冲突或者下一处冲突这两个菜单按钮有没有亮,有亮的话就赶紧跑到下一个冲突去解决掉

顺带说一下,你应该也看到了旁边还有前一处差异下一处差异两个按钮了,其实也是这样的,更新下来的代码变化也可能会有好多行发生了变化嘛,在比较差异/查看变更时也可以使用这两个按钮快速跳转差异的位置,好了不多啰嗦这些咯