现在一般开发都是协同开发了,所以会用到版本控制系统,说白了就是大家一起开发一个项目,分别写不同的代码,然后需要把代码汇总到一起,大家可能互相需要对方写的代码,就是大家共同去写一套代码,这就是需要版本控制系统,把大家写的代码存放到一个地方,相当于一个备份服务器!

主流的版本控制系统,现在来说,就是Git和SVN了,而且Git似乎更加流行,当然也有很多公司使用SVN,我目前经历的几家公司都是在使用SVN,所以本篇文章就来详细的介绍那些你需要会的,在工作中经常用到的SVN技巧与使用!

首先看看啥是SVN

以下是百度百科的解释:

SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。

如果你还是有点不了解,建议多去百度搜搜,比如你可以这样搜索:“什么是SVN”,建议多看看百度百科和维基百科之类的,上面说的还是比较详细的!

要用它就得安装它

先来说Windows上的安装,简单来说说,我们要使用SVN的话就需要安装一个客户端,好比你要听音乐的话就需要安装一个音乐软件在电脑上,当然,你可以选择安装qq音乐或者是网易云音乐!

那么SVN的话也是有版本可以选择的,在Windows上的话就是小乌龟,这是这个客户端的别名,人家叫做“TortoiseSVN”,因为Tortoise是乌龟的意思,所以就叫做小乌龟了,你看看它的图标:

 

可以吧,是不是很可耐,我们要下载它:
https://tortoisesvn.net/downloads.html

 

根据自己的电脑情况,选择安装即可!

这里有些需要注意的地方:

 

选择这个就行,另外在上面选择安装下载哪个版本之后,在跳出来的页面记的选择左下角的accept,然后等待下载,如果长时间没有下载可以手动点击页面上面第一行的链接,仔细看,那段英文还是可以看懂的,我这里就不贴图了。

如果你需要使用命令行的话,这里可以选择上:

 

然后一路next即可!然后安装之后,你在电脑上随便找一个文件夹右键出现这个就代表安装成功:

 

然后你也可以再操作:

 

这也代表是ok的!另外说一点啊,这个安装之后都是英文的,其实可以安装中文简体语言,但是嘞,我觉得还是用英文吧,真的,能用英文不要使用中文,咱可是高大上的程序员啊!

安装之后,搞起,看看怎么使用

上面都是准备工作,现在搞好了,怎么使用嘞,咱们一起来看看!

svn是个中心化的东西

啥意义嘞,就是说svn是有一个服务中心的,总的代码就在这个服务中心上,然后其他各个电脑上的客户端可以链接到这个中心,从而可以从中心拿取代码以及提交代码,画个图大概就是这样的:

 

所以啊,一般如果你们是使用svn协同开发的话,你们就会有中心服务代码,这个是你不需要管的,你只需要在你的电脑上安装好svn客户端就行了,上述已经告诉你如何安装了。

可能有些人比较好奇,这个服务中心是啥在哪啊,这个一般就是svn服务器,也是需要搭建的,可以本地搭建,也可以远程搭建,公司一般就是远程大家,大家一起食使用了,这个大家感兴趣,我到时候可以另外写一篇教大家如何搭建svn服务器!

开始拉取代码吧(第一个重点)

一切准备就绪,你的本地上也安装了svn客户端,这个时候啊,就会有个人给你svn服务器的一个项目地址,比如以我本地搭建的svn服务器地址为例,给你看看,是这个样子的:

 

比如说,这里要让你参与simplejava项目的开发,这个时候就会给你一个地址:

https://LAPTOP-GO8995UD:8443/svn/SVNdemo-ithuangqing/simplejava

然后还会给你分配一个用户名和密码:

username: user1 password: user1

拿到这些之后,你就可以拉取代码了,首先你先想想你要把拉取下来的代码放在哪里,比如桌面上,可以新建一个文件夹比如叫做“project”

 

然后打开这个文件夹,接着右键出现这个,点击这个:

 

点击之后就会弹出这个窗口:

 

这里意思就是你要连接svn服务中心了,但是也不能随便连啊,需要用户名和密码,这个是给过你的,我们填写上去,注意这里的左下角,是否记住密码:

 

这样就拉取成功了,但是你看看拉取下来的代码,我们服务中心上这个项目叫做simplejava,其实我也想拉取下来就是这个simplejava,这样拉取下来的都是项目中的文件,怎么办?

其实可以这样做:

 

我们点击这个Choose items,可以看到我们要来取得这个项目的内容,这个时候我们可以把这个项目名称去掉,也就是专这样:

 

这样就可以看到更广的一面,然后选择我们要拉取得那个项目,然后ok,拉去下来就是这样得了

 

权限问题

但是这样真的可以吗?答案是有的时候还真不可以,比如我们再试一次:

 

好,这个没问题,我们再试着看看上一级:

 

吆喝,不行了,这是咋回事,其实也好理解啊,人家总体的代码也不能说你想看就想看啊,让你做啥就做啥得了,不是你做的项目你看的全力都没有,所以啊这里是有权限的,你看看服务中心这些:

 

这里每一个文件夹其实都是可以分配权限的,也就是说,让你参与进来开发,会给你创建一个属于你的账户,但是你的账户是有读写权限的,有些你可以看,而有些你是看不了的。

所以,有的时候拿到账户和地址之后,发现出现问题,拿去不到代码,那就问问是不是权限没给你开,有的时候还真的是权限没开,我就碰到过。

至于如何设置权限啥的,这是svn服务器这块的知识,咱这里先不涉及,等咱聊到svn服务器搭建的时候再说吧!

那你可能要问了,我看不到那咋办啊,简单啊,自己在本地先创建项目文件夹,比如要拉取simplejava,就先创建一个呗,然后再拉取,一样的:

 

好啦,写写代码,咱也提交吧

那以上准备工作搞定之后,你就该写代码啦,来来,打开咱拉取的代码:

 

我们看到里面就一个Java类,来来,咱给他修改修改:

public class Test1 {
    public static void main(String[] args) {
        System.out.println("欢迎学习svn!");
        System.out.println("大家好,我是用户user1");
    }
}

可以吧,ok,现在咱也写代码上去了,接下来看看变化:

 

看看,这里出现红感叹号,难道是错误?其实不是的,这里代表代码有改变了,毕竟你新增加了代码嘛,接下来就把自己新增加的代码提交上去吧,可以这样操作:

 

右键需要提交的文件,然后点击commit,弹出如下框框

 

然后就ok了,看一下,是不是又变回绿色了。

增加一个新东西

可以吧,第一次提交,很有成就感,接下来看看,假如说我们新增加了一个Java类嘞,来来,写一个:

 

这里我们创建了一个新的User类,其实吧,被svn管理起来之后,就会在文件上面显示相对应的表示,比如正常的java文件上面显示一个绿色的勾号,但是吧,有的时候这玩意会出现问题,比如这新增加的一个文件应该在上面显示一个蓝色的问号,大致的标识是这样(对于Java文件来说)

 

要记住了,新增加的一个文件属于未知文件,我们需要把它添加进我们的版本库:

 

添加进来之后就被识别了

 

是一个蓝色的+号,接着我们就可以把它提交了

 

提交步骤和上面的类似

 

我想删除一个文件,怎么搞

有的时候可能需要删掉一个文件,就比如把刚才创建的User给删除了,我们可以这样做:

 

这个时候你删除之后,突然后悔了怎么搞?你使劲的按键盘上的Ctrl+Z,好像没什么卵用,你需要这样操作:

 

记住,是点击空白处,不过你如果真的想删除的话,当你上述操作删除之后,其实在服务中心上的文件还是没有删除,你还需要进行提交,点击空白处,选择提交:

 

这个时候就成功删除啦!

我怎么提交不上去啊(更新代码)

我们使用svn是进行协同开发,也就是说这些代码并不是只有你自己在写,其他人也在写,比如别人对Test1进行了修改,比如这样:

public class Test1 {
    public static void main(String[] args) {
        System.out.println("欢迎学习svn!");
        System.out.println("大家好,我是用户user1");
        System.out.println("大叫好,我是用户ithuangqing");
    }
}

你看,这是另外一个人添加的新代码,这时候你再看看你的代码,你的还是这样的:

public class Test1 {
    public static void main(String[] args) {
        System.out.println("欢迎学习svn!");
        System.out.println("大家好,我是用户user1");
    }
}

比如,你开始修改这个代码:

public class Test1 {
    public static void main(String[] args) {
        System.out.println("欢迎学习svn!");
        System.out.println("大家好,我是用户user1,好好学习天天向上!");
    }
}

然后你也开始提交,但是你看

 

我去,报错了报错了,肿么办?来,先翻译一句英文:

 

知道咋回事不,就是服务器上的代码改变了,你这里不是最新的,你需要更新一下,那就更新一下:

 

然后再看看更新下来的代码:

public class Test1 {
    public static void main(String[] args) {
        System.out.println("欢迎学习svn!");
        System.out.println("大家好,我是用户user1,好好学习天天向上!");
        System.out.println("大叫好,我是用户ithuangqing");
    }
}

看,是不是有用户ithuangqing添加的代码了,然后提交吧,这下就保证成功了的!

我去,冲突是咋回事

协同开发肯定会遇到的一个问题就是冲突了,一般的话就是你和别人修改了同样位置上的代码,来看个例子:

首先别人修改了这行代码:

public class Test1 {
    public static void main(String[] args) {
        System.out.println("欢迎学习svn!");
        System.out.println("大家好,我是用户user1,好好学习天天向上!-- 别学了,学不会的,哈哈");
        System.out.println("大叫好,我是用户ithuangqing");
    }
}

然后你也修改了这行代码:

public class Test1 {
    public static void main(String[] args) {
        System.out.println("欢迎学习svn!");
        System.out.println("大家好,我是用户user1,好好学习天天向上!真难啊");
        System.out.println("大叫好,我是用户ithuangqing");
    }
}

这里你需要捋一下,就是上面人家已经修改了这段代码,并且提交上去了,你这里没有先更新,而是直接修改了代码,然后你开始提交,发现这个错误:

 

这个问题之前说过了,那就去更新呗,结果:

 

这就出现冲突了,其实也好理解,你俩都去修改这段代码,人家的已经提交上去,你去更新,相当于把服务器上的这行代码拉去下来,然后发现你也修改了,那完犊子了,谁修改的是对的呢?应该留下哪个呢?

这时候就需要解决冲突了,这个时候你再看文件:

 

这都是啥玩意?这是因为出现冲突了,需要你解决冲突,怎么解决嘞?我们打开源文件看看:

 

这个时候就需要你处理,该留下哪段代码,这个是需要和别人商量的,看看是哪里出问题了,一起看下最终决定六留下哪段代码,比如最终你自己的修改是对的,那就把这些删除掉:

 

然后就成这样了:

 

然后你再看这些文件:

 

不是已经解决了冲突了吗?是的,你是解决了冲突,但是你没有告诉svn啊,你得给svn说声冲突解决了,这样操作:

 

然后这个:

 

点就ok就彻底解决冲突啦:

 

冲突解决了之后,你就可以正常提交你的修改啦!(之前提交不成功,需要更新,更新遇到了冲突,解决冲突之后,再次提交就没问题啦)

查看日志

日志这个玩意,在以后的开发中务必引起重视,在这个svn里面,我们也是可以查看日志的,比如我们查看这个类的日志:

 

在这里可以看到自己和他人对这个文件的一些修改。

版本回滚需要重视

这个功能也是使用比较多的,但是刚开始的话会觉得有点摸不着头脑,比如我们在写代码的时候,后来发现自己写的代码有问题,结果已经提交上去了,别人拉取咱的代码,那肯定出问题啊,怎么搞,这个时候咱们就可以使用版本回滚,来看看具体怎么操作。

比如现在我们需要写个功能,这样写的:

 

然后我们也提交上去了,咋整,后悔了,能不能时光倒流,人家更新代码的话,会更新到我的错误代码,你看看人家原来是这样的:

 

然后人家更新了下,就是这样的:

 

啪啪打脸啊,不行,我得把自己的错误代码干掉,怎么搞嘞,那就是版本回滚,看着:

 

然后选择需要回滚的版本:

 

然后你再看,其实之前的错误代码已经没有了。

注意注意注意!

当你写了错误的代码提交上去之后,别人更新会更新到你的代码,但是这个时候可能只有你知道这段代码有问题,而你想重新写,那就像上面那样,你进行版本回滚,之前的错误代码都没了,你可以重新写,但是,别人现在更新还是会得到你之前的错误代码。

所以这个时候你需要commit一下,把svn服务器上的提交的错误代码也恢复到原来的版本,记住回滚之后需要提交一下!

如果你回滚之后没有commit,而是继续写正确的代码,就会是另外一种情况(不commit的话是没有真正回滚的,本地回滚,但是远程服务器没有),这个时候当你把正确的代码写完之后,提交上去的话,会提示你更新,你一旦更新,就会产生冲突,和你之前的错误代码冲突了,这个时候你需要解决冲突,留下正确的代码,然后跟提交上去,这个时候别人再次更新就会得到你正确的代码了。

有没有更好的方式

以上那种回滚导致的错误是使用这种回滚方式:

 

实测中会出现回滚之后没有commit就写了新的代码,紧接着提交的时候会提示更新,更新会出现冲突,但是如果使用这种方式回滚:

 

即时回滚之后没有commit就写了新的正确的代码,再次commit提交依然可以完成,不会像上面那样,提示你更新,然后更新会出现冲突!

至于为什么会出现这样的情况,我们有深入的研究,后期如有需要会继续分享!

总结

关于svn的使用,对于一个刚入职初次使用svn的朋友来说已经够用了,主要的还是要明白一些操作概念,然后熟练掌握更新和提交,一般在写代码之前先更新一下,避免出现冲突,其他更多的就是在实际的使用中遇到新的问题再查资料或者请教他人快速解决,快速积累经验!

感谢各位大大的阅读

来源 :公众号| 编码之外