1.1 关于版本控制

1.1 关于版本控制 本章为 Git 入门。我们从介绍版本控制工具的背景知识开始然后讲解如何在你的系统上运行 Git最后是关于如何设置 Git 以便开始工作。通过本章的学习你应该能了解为什么 Git 这么流行为什么你应该使用 Git 以及你应该如何设置以便使用 Git。什么是“版本控制”什么是“版本控制”我为什么要关心它呢版本控制是一种记录一个或若干文件内容变化以便将来查阅特定版本修订情况的系统。在本书所展示的例子中我们对保存着软件源代码的文件作版本控制但实际上你可以对任何类型的文件进行版本控制。如果你是位图形或网页设计师可能会需要保存某一幅图片或页面布局文件的所有修订版本这或许是你非常渴望拥有的功能采用版本控制系统VCS是个明智的选择。有了它你就可以将选定的文件回溯到之前的状态甚至将整个项目都回退到过去某个时间点的状态你可以比较文件的变化细节查出最后是谁修改了哪个地方从而找出导致怪异问题出现的原因又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着就算你乱来一气把整个项目中的文件改的改删的删你也照样可以轻松恢复到原先的样子。但额外增加的工作量却微乎其微。本地版本控制系统许多人习惯用复制整个项目目录的方式来保存不同的版本或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单但是特别容易犯错。有时候会混淆所在的工作目录一不小心会写错文件或者覆盖意想外的文件。为了解决这个问题人们很久以前就开发了许多种本地版本控制系统大多都是采用某种简单的数据库来记录文件的历次更新差异。其中最流行的一种叫做 RCS现今许多计算机系统上都还看得到它的踪影。RCS 的工作原理是在硬盘上保存补丁集补丁是指文件修订前后的变化通过应用所有的补丁可以重新计算出各个版本的文件内容。集中化的版本控制系统接下来人们又遇到一个问题如何让在不同系统上的开发者协同工作于是集中化的版本控制系统Centralized Version Control Systems简称 CVCS应运而生。这类系统诸如 CVS、Subversion 以及 Perforce 等都有一个单一的集中管理的服务器保存所有文件的修订版本而协同工作的人们都通过客户端连到这台服务器取出最新的文件或者提交更新。多年以来这已成为版本控制系统的标准做法。这种做法带来了许多好处特别是相较于老式的本地 VCS 来说。现在每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。事分两面有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时那么在这一小时内谁都无法提交更新也就无法协同工作。如果中心数据库所在的磁盘发生损坏又没有做恰当备份毫无疑问你将丢失所有数据——包括项目的整个变更历史只剩下人们在各自机器上保留的单独快照。本地版本控制系统也存在类似问题只要整个项目的历史记录被保存在单一位置就有丢失所有历史更新记录的风险。分布式版本控制系统于是分布式版本控制系统Distributed Version Control System简称 DVCS面世了。在这类系统中像 Git、Mercurial 以及 Darcs 等客户端并不只提取最新版本的文件快照而是把代码仓库完整地镜像下来包括完整的历史记录。这么一来任何一处协同工作用的服务器发生故障事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作实际上都是一次对代码仓库的完整备份。更进一步许多这类系统都可以指定和若干不同的远端代码仓库进行交互。借此你就可以在同一个项目中分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程比如层次模型式的工作流而这在以前的集中式系统中是无法实现的。