在日常开发工作中,程序员会频繁与版本控制工具打交道来管理自己的代码。
目前用到相对比较广泛的版本控制管理工具应该是 SVN 和 Git 。这里主要针对这两者的区别做个简单的概述。
定义
SVN:是一个远程集中式的版本控制系统,与 RCS、CVS 比较来说,SVN 采用了分支管理系统,其设计的目的是为了取代 CVS 。
Git:是一个开源的分布式版本控制系统,可以有效、高速地处理从小到非常大的项目版本管理。
主要区别
1.存储方式的区别
Git 是将内容按照元数据的方式进行存储(类似于 key/value
数据库的形式,可以理解成Map)。
将内容丢到 Git 的类数据库中(也就是将文件中的内容取出来存到数据库当中),其会返回一个 key
值,这个 key
值相对于内容来说是唯一的,也就是说当插入重复的内容时所返回的 key
值是一样的。
Git 基于 key
值获取指定内容,将每个文件的版本中的内容都保存在其数据库当中,当要进行版本回滚的时候,就通过其中的一个 key
值将其取回并做替换。
Git存储示意图
Git存储示意图
SVN 则是按照源文件的形式进行存储。
换句话来说也就是对文件进行拷贝。
如果需要回滚的话,只需要将其对应版本的文件做替换即可。
几乎所有的版本管理系统都是将文件的元信息隐藏在类似.svn
、.cvs
等文件夹当中。而 .git
文件夹则可以说是本地机器上的一个克隆版的版本仓库,它包含了远程中心版本仓库上的所有东西,例如标签,分支,版本记录等等。所以将 .git
文件夹的体积大小与 .svn
进行比较,会发现两者的差距很大。
2.使用方式的区别
SVN的基本使用过程图
SVN的基本使用过程图
SVN 的使用过程相对比较简单,针对所修改的内容提交只需要进行 commit
操作就够了,检出也只需要 checkout
。
如图所示,无论是员工A还是员工B,在修改完代码后只需要 commit
将修改的内容提交至远程仓库即可。员工C只需要通过 checkout
将内容从远程仓库检出至本地。
Git的基本使用过程图
Git的基本使用过程图
Git 就与 SVN 完全不同。
如图,员工A将修改的内容提交至远程仓库需要经过以下几个步骤:
- 将修改的内容通过
add
添加到本地暂存区 - 从暂存区通过
commit
添加到我们的本地仓库 - 通过
push
推送到远程仓库
同样,员工B从远程仓库检出代码至本地需要经过以下几个步骤:
- 将远程仓库的内容
clone
至本地仓库 - 从本地仓库
checkout
检出至本地工作空间
总的来看,从本地将新增或者修改的文件推送至远程仓库的过程当中,SVN 只需要 commit
一个步骤就够了,而 Git 则需要经过 add
、commit
、push
三个步骤。
从远程仓库检出代码至本地工作空间的过程当中,SVN 只需要 checkout
一个步骤就够了,而 Git 则需要经过 clone
、checkout
。
3.版本管理模式的区别
Git 是一个分布式的版本管理系统,而 SVN 是一个远程集中式的管理系统。
SVN集中式管理模式图
SVN集中式管理模式图
在这里我们的 SVN 只支持一个远程仓库,如果说我们的远程 SVN 仓库挂掉了,那么本地项目就不能够进行提交、分支的切换等版本相关的任何操作。这也是集中式管理系统所存在的一个缺陷。
Git分布式管理模式图
Git分布式管理模式图
本地 Git 仓库是跟着项目走的,而不是跟着本机走的。也就是说一个项目内包含一个完整的 Git 仓库,多个项目会包含多个 Git 仓库。
远程 Git 仓库所能做的事情,本地 Git 仓库也能做,例如:代码的提交、版本的回滚、分支的切换等操作。
当然本地 Git 仓库也直接能和我们的远程 Git 仓库进行关联,Git 提供四种通信协议(local
、ssh
、http
、git
)来支持与远程仓库的连接。
Git 还支持多个远程仓库,即一个本地 Git 仓库能够连接多个远程 Git 仓库。
所以即便是挂了一个远程 Git 仓库,我们仍然可以切换其他的远程 Git 仓库进行提交、分支的切换等版本相关的任何操作。就算是所有远程仓库都挂了,我们仍然能在本地 Git 仓库进行相应的操作。