常用的版本控制工具分析

工作了十多年,只用过三种版本(源码)控制工具,有刚出道的CVS,后来的SVN,到这几年SVN跟Git都在使用。对于这些工具,我想说我们是人,要做到人使用工具,而不是工具指挥人,不要去争哪种工具好或哪种工具不好,要看所处的环境或场合,合适才是最好的。

在开发过程中,会不断涌现新需求,不断发现Bug、修复,如果不进行版本控制,软件将永远不会发布,或今天一个版本,明天又是一个版本。所以,必须允许可以对产品的版本进行任意回滚并实现多人协同开发。这也是版本控制的两个重要作用。以下的内容以CVS、SVN、Git展开:

一、名称解析

1.1 版本控制工具

什么是版本控制工具?它提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,是支持软件公司的配置管理活动,追踪多个版本的开发和维护活动,及时发布软件。

1.2 集中式版本控制工具

集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作。代表作有CVS,SVN等。

1.3 分布式版本控制工具

分布式版本控制系统:分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无需要联网了,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的修改了。代表作有Git。

1.4 CVS

CVS(Concurrent Version System)是源于unix的版本控制工具,用来管理代码或文档。CVS采用C/S体系,代码、文档的各种版本都存储在服务器端,开发者首先从服务器上获得一份复制到本机,然后在此基础上进行开发。开发者可随时将新代码提交给服务器,也可以通过更新操作获得最新的代码,保持与其他开发者的一致。功能单一,但在早期“物质”缺乏的年代,它是一个很好的助手。

1.5 SVN

SVN(Subversion)是一个开放源代码的版本控制系统,相较于CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。它除包括了CVS 的大多数特点外,还有一些新的功能,如:文件目录可以方便的改名、基于数据库的版本库、操作速度提升、权限管理更完善等。

1.6 Git

Git是一个开源的分布式版本控制系统,旨在快速高效地处理无论规模大小的任何软件工程。与常用的版本控制工具 CVS, SVN 等不同,它采用了分布式版本库的方式,使源代码的发布和交流很方便。每一个Git克隆都是一个完整的文件库,含有全部历史记录和修订追踪能力。其最大特色就是“分支”及“合并”操作快速、简便。支持离线工作,Git是整个项目范围的原子提交,而且Git中的每个工作树都包含一个具有完整项目历史的仓库。

二、版本控制工具分析

2.1 版本控制工具发展

有人就有江湖,有江湖就有工具,版本控制工具经历了多年的演变,产生众多种类:

  • 第一代:VCS
  • 第二代:VSS,CVS
  • 第三代:ClearCase,SVN,Perforce,TFS
  • 第四代:Mercurial,Git

我们从版本版本控制工具的发展过程中就可以体会出版本管理的好处和技术的不断发展,满足我们的不同需求。作为普通的程序员,我们大部份只需了解工具的特点及如何使用即可;当然,你若足够NB,又有那份心,那完全可以写一个工具出来(记得分享)。

2.2 版本控制工具比较

由于CVS太老,现在用的人也少,在此就不作比较;如果你还在用,建议你赶紧切换。

工具名称 版本库模型 存储内容 分支管理 全局版本号 部分克隆
SVN 集中式 按文件 不同目录 支持
Git 分布式 按元数据 同一目录 不支持

Window环境下版本控制软件菜单:

比较说明:

2.2.1 版本库模型

Git是分布式的,而SVN是集中式的。其实Git跟SVN一样有自己的集中式版本库或服务器。但Git更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以说,如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提交文件,查看历史版本记录,创建项目分支等。对一些人来说,这好像没多大用处,但当你突然遇到没有网络的环境时,这个将解决你的大麻烦。

2.2.2 存储内容

Git把内容按元数据方式存储,而SVN是按文件。所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。

2.2.3 分支管理

Git 分支和SVN的分支不同。分支在SVN中一点不特别,就是版本库中的另外的一个目录。然而,处理Git 的分支却是相当的简单和有趣,你可以从同一个工作目录下快速的在几个分支间切换。很容易发现未被合并的分支,也能简单而快捷的合并这些文件。

2.2.4 全局版本号

Git 没有一个全局的版本号,而SVN有。SVN的版本号实际是任何一个相应时间的源代码快照,它是从CVS进化到SVN的最大的一个突破。Git 可以使用SHA-1来唯一的标识一个代码快照,但这个并不能完全的代替SVN里容易阅读的数字版本号。

2.2.5 部分克隆

部分克隆指是否支持只拷贝版本库中特定的子目录。Git不支持,而SVN支持。

2.3 主干与分支

Trunk、Branches、Tags 区别:

名称 内容
Trunk 软件开发过程中的主线,开发时版本存放的目录,即在开发阶段的代码都提交到该目录上,保存了从版本库建立到当前的信息。
Branches 软件开发过程中的分支,发布版本存放的目录,即项目上线时发布的稳定版本存放在该目录中,保存了从版本库的某一特定点(不一定是版本库建立时)到当前的信息。
tags 表示标签存放的目录,tags只可读,不可写

分支主要用于在不影响Trunk其它用户情况下进行一些关于新功能的探索性或实验性的开发,待新功能完善后它也可以合并到Trunk中。

2.4 版本控制各平台工具

列举了一些电脑端常用的版本控制工具:

平台 SVN Git
Window TortoiseSVN TortoiseGit
Mac CornerStone SourceTree

三、总结

SVN作为集中式的版本管理系统,依然有它的优缺点:

优点:

  • 管理方便,逻辑明确,操作简单,上手快;
  • 易于管理,集中式服务器更能保证安全性;
  • 代码一致性非常高;
  • 有良好的目录级权限控制系统。

劣势:

  • 对服务器性能要求高,数据库容量经常暴增,体量大;
  • 必须联网。如果不能连接到服务器上,基本上不可以工作,如果服务器不能连接上,就不能提交,还原,对比等等;
  • 不适合开源开发;
  • 分支的管控方式不灵活。

Git的优缺点如下:

  • 适合分布式开发,每一个个体都可以作为服务器。每一次Clone就是从服务器上pull到了所有的内容,包括版本信息;
  • 公共服务器压力和数据量都不会太大;
  • 速度快、灵活,分支之间可以任意切换;
  • 任意两个开发者之间可以很容易的解决冲突,并且单机上就可以进行分支合并;
  • 离线工作,不影响本地代码编写,等有网络连接以后可以再上传代码,并且在本地可以根据不同的需要,本地新建自己的分支。

CVS版本控制系统目前基本快要淘汰;SVN和Git的思想差别很大:公司里的集中式管理用SVN,开源开发Git更合适。

SVN和Git在用户管理和权限控制上都很强大而且方便。SVN更适合有稳定的集中服务器,开发人员数目不是非常多,如几十人的情形;Git更适合大规模的分散开发,每个开发者大多数时间都是照看自己的小摊子的情形。

千言万语一句话:只有适合的才是最好的!