在讨论git之前,我们会先认识下版本控制工具(version control tools),然后我们会让演示如何运行Git,让它支持你的开发工作。
什么是版本控制工具,我们为什么要使用它?版本控制是一个记录文件修改记录的系统,或者说是保留文件不同时间点版本的系统,让你在以后可以随时重新调取不同时间点的版本,一般来说我们用版本控制系统来管理我们的代码,但是从理论上,你可以对计算机上的任何文件,都可以进行管理。
如果你是一个图片或WEB设计师,你想保留一张图片的每一种版本(或页面的每一版本的布局,通常你会喜欢这样做),那么你可以使用版本控制系统(version control system VCS)就是不错的选择:VCS允许你回退文件到某个以前的状态,或是恢复整个项目到以前的某个状态,或是重新回顾曾经做的那些修改,让你找到哪项修改导致了目前的问题,
谁发起的修改,什么时间发起的,和更多的其他信息。使用VCS意味如果你搞乱项目或是丢失了文件,你可以很容易的做恢复操作,而做到这些仅仅需要很小的系统开销。
许多人的版本控制方法,就是复制文件到另外的目录(该目录也许是个带有时间标记的目录),这个方法非常普遍,因为它的简单,但是它也是有很大的错误隐患,你会忘记一些关于目录的操作,会发生了编辑了不应该编辑的文件,或是复制了本来你不想复制的文件,因而这样的方法,有很大的可能,让你把事情搞的一团糟。
为了避免这样的错误,程序员很早前就开发了本地的VCSs,这里的VCSs就是以个保留你文件所有修改记录的数据库,如下图示:
有一个非常普遍应用的vcs系统,被称为rcs,这个系统至今仍然运行在非常多的计算机上,甚至在Mac OS x操作系统上,当你安装了开发工具以后,也会包括这个rcs.
RCS通过保留不同时间的文件之间的不同(按照补丁包集的形式保留),从一个版本到另一个版本进行转换,它可以恢复几乎任何时间点上的文件版本,通过添加补丁包。
接下来的问题则是更加普遍的,发生在用户之间需要在开发过程中相互协作的时候,为了应对协作出现的问题,通用版本控制系统被开发出来(Centralized version control Systems CVCSs),
这类系统的出色代表,例如CVS,Subversion 和Perporce,有一个单独的服务器,来保存所有版本的文件,和一组客户端,通过从核心服务器check out文件。很多年依赖,这样的版本控制系统,一直占据主流位置,是事实上的版本控制标准。
这类系统,比本地版本控制系统有很多的优势,例如每个人都指导项目的其他人在做什么级别的修改。管理员拥有优秀的权限控制,可以定义谁可以做什么,并且它更加的方便管理,较之本地数据库需要安装到每个客户端的情况。
但是这样的方式也有不足,最明显的是只有一个独立的核心服务器,如果发生单点故障就是致命的,甚至如果在核心服务器上的数据发生了丢失(例如硬盘发生了物理故障),项目会发生大的问题,你会失去所有关于项目的版本保存,这样的风险,类似本地版的版本控制系统。
Distributed Version Control System(DVCs)分发式版本控制系统,在DVCs下(例如,Git,Mercurial,Bazaar和Darcs),客户端不会在check out文件最近的快照版本,它们都被镜像到一个代码库。因此如果任何服务器死机,那么任何的客户端库都可以被复制到服务器让服务器进行恢复到完整状态。每一次checkou都是一次全数据的备份。
此外,多个这样的系统可以在使用一些远程库的时候可以协作的很好,所以你可以跟不同的组织的人按照不同的风格工作在一起,在同一个项目里进行无缝合作。
允许你建立不同的工作流流程,例如层级模型,而这在上面两种版本控制系统上是不可能做到的。
正如很多不平凡的事情都开始于某项破坏性的危机和激烈的冲突一样,linux kernel是一个非常大的开源项目,在大多数linux kernal维护的时间段里(1991-2002)都是通过发布补丁和压缩文件的方式来完成的,在2002年,linux kernel项目开始使用一个专有的DVCS系统BitKeeper.
在2005年linux kernel社区与开发BitKeeper的公司产生了分裂,因此BitKeeper重新开始收费,但是这也同时激发linux开发社区(尤其是linux之父Linus Torvalds)开发它们自己的包含BitKeeper优点的软件,这个新系统被赋予了如下的特性:
l 速度
l 简单的设计
l 对非线型开发有强大的支持(数以千计的并行开发组织一起协作的场景)
l 完全的分布式
l 可以应用在大的项目上尤其像linux kernel这样的项目(速度和数据大小支持)
自从2005年,Git就被逐步开发出,并且达到了上述的品质要求,具备不可思议的高效率,而且它可以在大的项目上应用,而且可以支持庞大的非线型开发。