Category Archives: Progit
Progit 第一章 新手上路 第一节 关于版本控制
关于版本控制 什么是版本控制,为什么我们需要关心它?版本控制是这样一个系统,它按照时间一个记录一个和多个文件的变化,从而你以后可以回顾任何一个特定的版本。对这本书当中的例子来说,你将使用软件的源代码作为被版本控制的文件,尽管在现实当中你可以通过计算机对任意类型的文件进行版本控制。 如果你是一名图形或者Web设计者,并且想保证每一个图像或者布局的版本都被保留下来(这些是你真的想要的),版本管理系统(VCS)是一个非常明智的选择。它允许你将文件回退到之前的状态,将整个工程回退到之前的状态,按照时间比较差异,查看是谁进行了最后一次可能导致问题的修改,谁在什么时候引入了一个问题,等等。使用VCS通常也意味着如果你把事情弄糟了或者有些文件丢失了,你可以很容易的恢复。另外,你只需要很小的代价就能得到这些。 本地版本控制系统 许多人的对版本控制方法的选择是将文件复制到另一个目录(也许是一个有时间戳的目录,如果他们聪明的话)。这种方法非常普通,因为它足够简单,但是也难以置信的容易出错。很容易你就会忘记你在哪个目录,并且意外地写入你或者复制不想要的文件。 为了处理这种问题,程序员很久以前就开发了本地VCS,它有一个简单的数据库,并且在版本控制下记录了所有的变化(见图1-1)。 图1-1. 本地版本控制图示 一个非常流行的VCS工具是一个叫做RCS的系统,它还在被很多电脑使用。连流行的Mac OS X操作系统当你安装了开发工具之后,也会包含RCS命令。这个工具通过一种特殊的格式来记录两两版本之间补丁的集合(文件之间的差异),从而进行版本控制;它可以通过应用所有补丁来重建任意时间点的任意文件。 集中式版本管理系统 下一个人们遇见主要问题是他们需要和其他系统上的人合作。为了解决这个问题,集中式版本管理系统(CVSC)被开发出来。这些系统,例如CVS,Subversion和Perforce,有一个独立的服务器包含了所有被版本管理的文件,一些客户端从那个中心服务器将文件Check out出来。在之后的许多年,这都成为了版本控制的标准(见图1-2)。 图1-2 集中式版本管理系统图示 这种设置提供了许多优势,特别是和本地VCS相比。例如,所有人可以了解别人在这个项目上都做了什么。管理员可以细致地控制谁可以做什么;而且管理一个CVCS和管理每个客户端的数据库。 但是,这种设置也有许多严重的缺点。最显著的缺点就是集中式服务器带来的单点失效。如果服务器停机一个小时,在这段时间内没有人可以对他们的工作进行合作,或者保存版本变化。如果中央数据库的硬盘出现冲突,而且没有做好备份,那么你就丢失了所有的东西——项目的所有历史记录,除了一些可能在人们硬盘上的快照。本地VCS系统也有同样的问题——当你将所有项目的历史放在一个地方,你就承担了丢失所有东西的危险。 分布式版本管理系统 这就是分布式版本管理系统(DVCS)为什么诞生。在DVCS(例如git,Mercurial,Dazaar或者Darcs)中,客户不仅仅取出了最新的快照:他们也是版本库的完整镜像。因此如果哪个服务器宕机了,并且这些系统通过它进行合作,任何一个客户的版本库可以复制到服务器并且恢复。每个Checkout都是对所有数据的完整备份(见图1-3)。 图1-3 分布式版本管理图示 更进一步,许多这种系统都可以很好的处理和多个远程版本库协作的工作,因此你可以和不同的组的人在不同的方式上同时工作于同一个项目。这让你可以建立许多不同类型的工作流,这在集中式系统中是不可能的,例如层次模型。