什么是版本控制(version control)?

**版本控制:**是一种记录一个or若干文件内容变化,以便将来查阅特定版本修订情况的系统。

在平时的日常生活中,最直观的体现是XX软件的更新。作为用户我们最关心的是更新后软件的体验,但是作为软件开发者,他们不仅要实现对软件的优化,更重要的是能对不同版本的代码文件有着良好的管理,以便为后续的开发服务。

要想实现对上述项目开发过程中不同修订版本的管理,这就是版本控制系统(Version Control System: VCS) 产生的最主要的原因。通过VCS你就可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地 方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。即使后续的项目开发过程中误操作一些文件,也照样可以恢复到原先的版本。

版本控制系统的分类

本地版本控制系统

实现版本控制最简单的方式就是复制整个项目目录来保存不同时间的版本。但是这种方式特别容易犯错,一不小心写错文件or覆盖其他文件or混淆所在的工作目录等。

其中最流行的一种是RCS,通过在硬盘上保存补丁集(补丁:指文件修订前后的变化),通过应用所有的补丁,可以重新计算出各个版本的文件内容。

Figure1: 本地版本控制

集中化版本控制系统

要知道大型的项目开发过程中,有多个开发者共同参与,如何让不同系统上的开发者协同工作呢?显然,本地版本控制系统不能实现。于是,集中化版本控制系统(Centralized Version Control System: CVCS)应运而生。

CVS,Subversion以及Perforce等属于这类系统。它们都有一个单一的集中管理的服务器,保存所有文件的修订版本,协同工作人员可以通过客户端连接到这台服务器,取出最新文件或者提交更新。

Figure2: 集中化版本控制

**优点:**相对于Local VCS而言,现在每个开发者可以在一定程度上看到项目中其他开发者正在做什么。而且管理一个CVCS要远比在各个客户端上维护本地数据库更加容易。

缺点: 最明显的缺点是,如果宕机一个小时,则谁都无法提交更新,也就无法协同工作。如果中心数据库所在磁盘发生损坏,有没有适当的备份,则将丢失最新变更的所有数据,只剩下每个开发者在各自机器上保留的单独快照(snapshots),同时本地版本控制系统也有类似问题。

分布式版本控制系统

为了避免集中化版本控制系统所带来的缺点,于是分布式版本控制系统(Distributed Version Control System: DVCS) 出现了。这类系统有:Git,Mercurial,Bazaar以及Darcs等。

DCVS,客户端不只是提取最新的版本的文件快照,而是把代码仓库完整地镜像下来,包括完整的历史记录。

Figure3: 分布式版本控制

**优点:**每一个项目开发者的本地镜像都跟服务器上的项目源代码等同。