首先Git和SVN都是一种版本控制系统,并且GIT跟SVN一样有自己的集中式版本库或服务器。
不过Git是一个免费的开源分布式版本控制系统,而SVN是一个集中式版本控制系统。集中式系统,只有一个中央版本库,一旦故障,影响全部(单点故障问题),成员工作必须依靠网络,但资源集中;分布式系统,成员都可以是中央库,工作不需要网络。
Git只关心文件数据的整体是否发生变化,而SVN则关心文件内容的变化。 例:SVN每次记录有哪些文件作了更新,及更新了什么内容。 而Git 并不保存这些前后变化的差异数据,Git像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。
Git把内容按元数据方式存储,而SVN是按文件,所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
Git的内容的完整性要优于SVN: Git的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Git 绝大多数操作都只需要访问本地文件和资源,不必联网就可以看到所有的历史版本记录,而SVN 却需要联网,代码提交,SVN 断开网络或者断开VPN是无法commit代码,而 Git先commit到本地,再push的。
Git 克隆一个完整项目的速度非常快,SVN 非常慢,例如:克隆一份全新的目录,以同样拥有五个分支来说,SVN是同时复製5个版本的文件,也就是说重复五次同样的动作。而Git只是获取文件的每个版本的 元素,然后只载入主要的分支(master),例如:克隆一个拥有将近一万个提交(commit),五个分支,每个分支有大约1500个文件的 SVN,耗了将近一个小时!而Git只用了区区的1分钟!
分支(Branch)的不同,SVN,分支是一个完整的目录。且这个目录拥有完整的实际文件。如果工作成员想要开啟新的分支,那将会影响“全世界”!每个人都会拥有和你一样的分支。如果你的分支是用来进行破坏工作(安检测试),那将会像传染病一样,你改一个分支,还得让其他人重新切分支重新下载。而 Git,每个工作成员可以任意在自己的本地版本库开启无限个分支。举例:当我想尝试破坏自己的程序(安检测试),并且想保留这些被修改的文件供日后使用, 我可以开一个分支,做我喜欢的事。完全不需担心妨碍其他工作成员。只要我不合并及提交到主要版本库,没有一个工作成员会被影响。等到我不需要这个分支时, 我只要把它从我的本地版本库删除即可。
Git没有一个全局的版本号,而SVN有,SVN的版本号版本号其实就相当于对应时间的源码快照,可用于回退操作。但Git可以利用SHA-1的唯一来标示一个代码快照,却也远比不过SVN简单易懂的版本号,这是SVN的一个重大突破,要远优于Git。
SVN适于项目管理,Git适于代码版本管理
SVN支持中文,操作简单,界面统一,功能完善,美工、产品、测试、开发、设计都可以轻松上手。
Git 空间占用率低,易于代码分支管理,但图形界面支持较差,不支持中文,使用难度较大不易上手。
一个研发队伍正常包括:需求分析、设计、美工、程序员、测试、实施、运维,每个成员在工作中都有产出物,包括了文档、设计代码、程序代码,这些都需要按项目集中进行管理的。SVN能清楚的按目录进行分类管理, 使项目组的管理处于有序高效的状态。
Git优点
Git每台电脑都有一个版本库,可以在本地做版本管理。
速度快。Git的速度远超大部分版本管理系统,包括svn强大的分支管理功能
活跃的开源社区,如最著名的github
Git缺点
Git 没有严格的权限管理控制,一般通过系统设置文件读写权限的方式来做权限控制。
工作目录只能是整个项目。比如 checkout,建分支,都是基于整个项目的。而 svn 可以基于项目中的某一个目录
SVN优点
管理方便,集中式服务器更能保证安全性。
适合开发人数不多的项目开发。
相对简单,好操作。
SVN缺点
服务器压力太大,数据库容量暴增。
如果不能连接到服务器上,基本上不可以工作。
不适合开源开发。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。