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

优点:

  • 保存某一幅图片或页面布局文件的所有修订版本
  • 可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等
  • 可以轻松恢复到原先的样子,但额外增加的工作量却微乎其微

如今分为三类版本控制:本地版本控制、集中化的版本控制系统、分布式版本控制系统。

本地版本控制系统

人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异,其中最流行的一种叫做 RCS,现今许多计算机系统上都还看得到它的踪影。 RCS 的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。

在这种本地 VCS 系统发明之前,人们通常是自己手动把文件夹复制一份,命名为backup,就像备份游戏存档或者在做一些有可能出问题的重要操作前的直觉一样。

集中化的版本控制系统

本地VCS只能让使用该台电脑的人使用,而如果要进行团队协作,每个人都要修改和访问其中的一部分时,就必须提出新的解决方案。

于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。 这类系统,诸如 CVS、Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 多年以来,这已成为版本控制系统的标准做法。

优点是:

  • 每个人都可以在一定程度上看到项目中的其他人正在做些什么
  • 管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易

缺点也很明显:

  • 相较于每个人自己维护本地VCS并定期开会同步,把所有东西集中在一个服务器上当期崩溃或宕机时(单点故障),每个人都无法提交更新更别说协同工作
  • 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照 (本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险)

分布式版本控制系统

于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像 Git、Mercurial 以及 Darcs 等,客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如|层次模型式的工作流,而这在以前的集中式系统中是无法实现的。