一、深入理解版本控制
1、什么是版本控制?
版本控制(Version Control)/版本管理(Version Management)是为满足不同需求,对同一产品或系统进行局部的改进 和改型所产生的产品或系统系列的变更情况进行记录、跟踪、维护和控制的过程。
如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本,采用版本控制系统(Version Control System,VCS)是个明智的选择。 有了它你就可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。
2、版本控制系统的类型
版本控制系统VCS大致可以分为三种类型:
1)第一代:本地控制系统
许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异,比如SCCS(1972)、 PVCS(1985)等。
这代主要实现了基本的代码版本管理,但缺点是无法让多人同时对一个版本库进行修改。这个也和当时软件规模不够大有关,也没有这样的需求。
2)第二代:集中化的版本控制系统
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,CVCS)应运而生。 这类系统,诸如 CVS(1986), ClearCase(1992), Visual SourceSafe(1994), Perforce(1995), Subversion(2000) 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 多年以来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说, 现在每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
集中式版本控制系统的缺点也相当明显,包括:
- 1)在无法连接服务器的情况下,无法查看日志以及提交和比较代码版本(慢速网络和远程异地工作的程序员的痛),以及当服务或者网络出现问题的时候很多人员就会无法工作。
- 2)不支持local branch,导致branch创建管理复杂,并且一旦创建就很难修改(快速迭代开发中的程序员的痛)。
- 3)由于只有一个中心端服务器,一旦发生灾难性问题,那么所有日志都会丢失,所以需要经常做备份(备份需要不小的成本)。
- 4)如果软件代码量过于庞大,一般会出现速度缓慢的情况,因为每次的日志查询、不同版本之间的代码比较和代码提交等操作都需要和服务器通信,造成服务器端的负载过大。
3)第三代:分布式的版本控制系统
分布式版本控制系统(Distributed Version Control System,简称 DVCS),比如Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
3、版本控制系统的价值
在团队开发中使用版本控制系统的好处包括:
- 1)作为数据备份
- 这是一个主要的原因了。虽然数据备份同样可以用比较笨的方法:本地复制副本,但这种古老的方法有很多不足,无法应对频繁的修改,会照成版本混乱,不便于管理,并且占用空间。
- 2)版本管理
- 避免版本管理混乱。这是使用版本管理的最主要原因,也是版本管理的目的所在。你肯定不会希望在本地手动备份了多个副本后,到头来却不知道那个备份是最新的,那个备份进行了什么修改,修改日期是什么时候等等一切你记不清的问题。而版本管理软件能解决这些问题,它有详细的日志,能记住你的每一次提交、每一次改动,并且能够比较查看不同版本之间的异同,并且可以恢复到之前的任一版本。
- 3)提高代码质量
- 在没有版本管理之前,可能经常要在代码里写些不相关的注释,比如:某人某日对某代码进行修改;或是将一些不确定是否使用的代码用注释的形式保留等等,这些也就是僵尸代码啦。现在这些工作都可以交由版本管理工具完成,把这些不相关的僵尸代码从代码里删掉吧。
- 4)提高协同、多人开发时的效率。
- 及时提交更新代码,能让团队中的成员了解到代码的最新情况,避免重复劳动。
- 5)明确分工责任。
- 什么时候谁对代码做了修改、修改了什么内容,版本管理都会记录在案,方便查询,追究责任。
4、总结
不管是集中式版本控制,还是分布式版本控制系统,只要适合自己的团队的开发流程和工作方式,并且代码管理顺畅就可以了。