阅读 5365

Svn和Git的一次详细对比 - ic翼

原文链接: bingyishow.top

这段时间在做项目的时候出现了对于svn和git的一个选取问题。这里做了一个比较详细的比较。对比后对于我们来说最合适的还是git了。如果你也遇到了这个问题。可以参考一下这篇文章进行选取。

首先要声明的是这不是引战。写这篇文章主要是为了帮助不知道如何选择的人。文章中很多优缺点的分析并不是博主的观点。大都是参考了他人使用过后的分析进行了一次比较全面的整理。选择一个适合自己的使用就行了。


差异对比表

差异 svn git
系统特点 1.集中式版本控制系统(文档管理很方便)
2.企业内部并行集中开发
3.windows系统上开发推荐使用
4.克隆一个拥有将近一万个提交(commit),五个分支,每个分支有大约1500个文件,用时将近一个小时
1.分布式系统(代码管理很方便)
2.开源项目开发
3.mac,Linux系统上开发推荐使用
4.克隆一个拥有将近一万个提交(commit),五个分支,每个分支有大约1500个文件,用时1分钟
灵活性 1.搭载svn的服务器出现故障,无法与之交互
2.所有的svn操作都需要中央仓库交互(例:拉分支,看日志等)
1.可以单机操作,git服务器故障也可以在本地git仓库工作
2.除了push和pull(或fetch)操作,其他都可以在本地操作
3.根据自己开发任务任意在本地创建分支
4.日志都是在本地查看,效率较高
安全性 较差,定期备份,并且是整个svn都得备份 较高,每个开发者的本地就是一套完整版本库,记录着版本库的所有信息(gitlab集成了备份功能)
分支方面 1.拉分支更像是copy一个路径
2.可针对任何子目录进行branch
3.拉分支的时间较慢,因为拉分支相当于copy
4.创建完分支后,影响全部成员,每个人都会拥有这个分支
5.多分支并行开发较重(工作较多而且繁琐)
1.我可以在Git的任意一个提交点(commit point)开启分支!(git checkout -b newbranch HashId)
2.拉分支时间较快,因为拉分支只是创建文件的指针和HEAD
3.自己本地创建的分支不会影响其他人
4.比较适合多分支并行开发
5.git checkout hash值(切回之前的版本,无需版本回退)
6.强大的cherry-pick
版本控制 1.保存前后变化的差异数据,作为版本控制
2.版本号进行控制,每次操作都会产生一个高版本号(svn的全局版本号,这是svn一个较大的特点,git是hash值)
1.git只关心文件数据的整体发生变化,更像是把文件做快照,文件没有改变时,分支只想这个文件的指针不会改变,文件发生改变,指针指向新版本
2. 40 位长的哈希值作为版本号,没有先后之分
3.git rebase操作可以更好的保持提交记录的整洁
工作流程 1.每次更改文件之前都得update操作,有的时候修改过程中这个文件有更新,commit不会成功
2.有冲突,会打断提交动作(冲突解决是一个提交速度的竞赛:手快者,先提交,平安无事;手慢者,后提交,可能遇到麻烦的冲突解决。)
1.开始工作前进行fetch操作,完成开发工作后push操作,有冲突解决冲突
2.git的提交过程不会被打断,有冲突会标记冲突文件
3.gitflow流程(经典)
内容管理 svn对中文支持好,操作简单,适用于大众 对程序的源代码管理方便,代码库占用的空间少,易于分支化管理
学习成本 使用起来更方便,svn对中文支持好,操作简单,适用于大众 更在乎效率而不是易用性,成本较高(有很多独有的命令,rebase,远程仓库交互的命令,等等)
权限管理 svn的权限管理相当严格,可以按组、个人针对某个子目录的权限控制(每个目录下都会有个.svn的隐藏文件) git没有严格的权限管理控制,只有账号角色划分(在项目的home文件下有且只有一个.svn目录)
管理平台 有吧(这个“吧”字,肯定有,但本人没有接触过) gitlab(建议使用,集成的功能较多,API开发),gerrit,github等

Git和SVN最大的差异

SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器!这是两者之间最核心的区别。

Git用户有自己的本地的版本控制,SVN只有服务器上的版本控制。

Git里,每一个开发者在本地都有一个git仓库,在服务器上也有一个总的库;SVN则必须要把代码提交到中心控制器。

SVN只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

Git每一个终端都是一个仓库,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。每一次的提取操作,实际上都是一次对代码仓库的完整备份。

SVN 的主要功能

SVN属于集中化的版本控制系统,有个不太精确的比喻:SVN = 版本控制+ 备份服务器

SVN使用起来有点像是档案仓库的感觉,支持并行读写文件,支持代码的版本化管理,功能包括取出、导入、更新、分支、改名、还原、合并等。

功能有许多我就不一一列了,SVN大都采用图形界面操作,直观,上手快。

Git的主要功能

Git是一个分布式版本控制系统,操作命令包括:clone,pull,push,branch ,merge ,push,rebase,Git擅长的是程序代码的版本化管理。

SVN 的优缺点

SVN对中文支持好,操作简单,使用没有难度,美工人员,产品人员,测试人员,实施人员都可轻松上手。使用界面统一,功能完善,操作方便。

Git的优缺点

对程序源代码进行差异化的版本管理,代码库占极少的空间。易于代码的分支化管理。不支持中文,图形界面支持差,使用难度大。不易推广。

其他

分布式代码版本管理系统并不一定适合所有团队,比如中小团队可能更关心的只是成本更低,简单易用,那么SVN等这类集中式版本管理工具还是更为适合。但是不管团队最终选用什么代码版本管理工具,只要适合自己的团队的开发流程和工作方式,并且代码管理顺畅就可以了。不要评价哪个好那个坏什么的,两个是不同的东西。只要用着适合自己或者团队就可以了。

这里再插一句,除了文中做比较的两个还有一个hg(学名Mercurial)可以了解一下。