今天闲聊的时候,有位程序媛姐姐吐槽了一下小乌龟(TortoiseSVN):感觉小乌龟不好用,我还是习惯用IDE里的svn工具,但是IDE里的svn工具有的时候提交会有问题,唉...
我:不会啊,我觉得小乌龟挺好用的,你还是别用IDE里的svn了,谁知道IDE有没有对svn做什么私人订制(纯意淫)~
程序媛姐姐:可是我一直搞不太清楚小乌龟的冲突应该怎么解决
我秒回:我知道,有空跟你科普一下呗?
程序媛姐姐:好啊,晚上加班的时候吧。
想象一下程序媛姐姐的内心活动:翻了一个360度的白眼,切,姐只是随便找个理由来表示一下自己不喜欢小乌龟而已~看把你能的
拿到了一次装逼的机会,当然要好好对待。到晚上还有时间,不如搭建个svn服务器,上传份代码,实况演示一下。说干就干。
这里使用VisualSVN Server来搭建svn服务器。可以到这里根据需要进行下载。怎么安装就跳过了,这里主要看一下怎么创建仓库。
安装好VisualSVN Server以后,运行起来页面是这样的:
在创建代码仓库之前,需要先创建个用户,右键点击Users->Create User...,在弹出的页面里创建用户,用户名根据你自己的需要来,我这里写的wht:
然后点击OK,这个用户就创建好了。你可以通过创建Groups来给用户分组,对每个组的成员进行权限限制。
创建好了用户,就可以创建代码仓库了,右键点击Repositories->Create New Repository...,弹出页面选择仓库类型:
两种偏好:一种普通的基于标准FSFS数据存储的仓库,一种基于VDFS的分布式的仓库。具体细节可以点击弹框的左下角链接查看。我这里选择的第一种,点击下一步,给仓库起个名字:
依然下一步,这里选择仓库初始的目录结构,根据需要进行选择,我这里选的空仓库,也是VisualSVN Server推荐的。我们可以通过新建文件夹来自定义仓库目录结构,比较灵活:
接下来是仓库访问权限,同样根据需要进行选择,我这里选择自定义,然后点击custom...按钮,选择我们创建的用户wht,给他读/写权限:
然后点击Create,代码仓库创建成功,你会看到如下界面:
至此,我们的代码仓库就创建完成了,Repository URL就是代码仓库的地址,将来用svn客户端(小乌龟)checkout代码的时候会用到。
目前TestRepo仓库是空的,你可以通过右键点击仓库名,选择新建Folder来给仓库创建目录结构,我这里为TestRepo创建了trunk(放代码的地方),tags(打标签),branches(代码分支)三个目录。接下来就可以导入工程到svn服务器了,这步操作需要在svn的客户端(小乌龟)上来进行。
找到工程目录,右键点击文件夹>TortoisSVN>Import...,弹出页面:
仓库地址栏填入刚创建的代码仓库的url(可以右键点击仓库名,点击Copy url to Clipboard获取),点击OK完成导入。导入完成后你就可以在代码仓库的trunk目录下看到你导入的工程了。
这里提一下,每次使用svn客户端上传代码的时候最好都填写一下备注信息,这样有利于版本维护,这个地方是可以通过客户端进行必填设置的。
现在svn服务器搭建完成了,坐等程序媛姐姐的召唤。
...
终于等来这一神圣的装逼时刻。我们来看看代码冲突怎么发生以及怎么解决的。
1. 来到程序媛姐姐的座位上,用她的小乌龟客户端checkout一份工程代码到本地,打开工程,找个文件,修改一行代码,保存,注意,不提交。
2. 回到我电脑上,找到同样的文件,定位到同一行代码,做出修改,保存,这里提交到svn服务器。
3. 再次来到程序媛姐姐的电脑上,用小乌龟从svn服务器上更新一下代码到本地,发现小乌龟在抱怨代码冲突了(conflicted)。
看到没,小乌龟抱怨说main.js冲突!因为程序媛姐姐和我对同一个文件的同一个位置进行了修改,小乌龟不知道到底应该用谁的版本,所以报出冲突的警告。
看下工程目录,是这个鬼样子:
别慌,这几个文件分别是原始文件(main.js),程序媛姐姐本地修改后的版本(.mine),另外两个一个是程序媛姐姐本地修改前的版本,一个是svn服务器上目前的版本,也就是我修改后的版本。直接打开main.js看得更清楚:
代码里面已经标出来哪个是目前本地的修改,哪个是svn服务器上的版本(我用的是VSCode,在一些其他编辑器或IDE环境上会同时列出mine,r5,r6三个版本的代码)。这时候只需要根据具体情况来判断到底应该使用哪个版本。如果你需要继续使用你自己的版本,就删掉======和>>>>>>.r6之间的代码;如果你想更新成svn服务器上的代码,就删掉<<<<<<.mine和=======之间的代码。这里,我们保留程序媛姐姐自己的修改,所以删掉了我的修改(也就是svn上的版本)。插一句,在真实场景中,如果你和同事的代码冲突了,不要随意做决定,一定要和当事人沟通好,到底用你修改的版本还是他修改的版本,再做操作。
到这里还差一步,就是告诉小乌龟,我已经解决掉冲突了。右键点击冲突的文件>TortoiseSVN>Resolved...,这样那三个文件就消失了。至此,代码冲突解决完毕。
还有一种情况,冲突的代码是你由于某种原因(比如不小心碰到了键盘,临时作了修改)修改的,是铁定不会上传到svn上的,那就不用像上面那样操作了,直接连同原始文件一起删掉,然后重新update一下就ok了。
一顿操作下来,程序媛姐姐捧场的说:啊,是这样啊。内心活动估计又是一个惊天大白眼:就跟谁不知道似的~
反正我脸皮厚,我就当你不知道,哈!
希望对你有帮助。