分布式版本控制系统Git入门 ——(1)

最早的版本控制就是将文件拷贝一下,放到用不同时间戳命名的文件夹中。在此基础上出现了本地版本控制系统,基本原理就是用数据库等存储,将文件的每一个版本的保存下来,实现了本地的自动化版本控制系统(VCS=Version Control System)。

后来,人们产生了与别人协作,共同编辑文档的需求。由此,衍生了一种架构,使用一台单独的计算机作为服务器,专门管理文件的所有版本,这种结构,就叫做中央版本控制系统(CVCS = Centralized VCS)。这种架构一度成为了版本控制系统的事实标准。典型的有CVS,Subversion等等优秀地工具。

中央版本控制系统有诸多优势:

  1. 及时了解他人进度;
  2. 控制每个人对特定文件目录的读写权限;
  3. 更容易管理项目的代码文档;

事物总是具有其两面性,缺点也不可避免:

  1. 如果中央版本控制服务器荡机,则所有人无法提交文件;
  2. 如果中央服务器硬盘损坏,将丢失全部版本信息,本地版本控制系统也有这个问题;

为了能够规避上述的风险,那么我们需要把鸡蛋放在多个篮子里,于是,就要有冗余,于是就产生了分布式版本控制系统(DVCS = Distributed VCS)。代表产品有Git,Mercurial,Bazaar,Darcs等。在这种结构中,也有一台中央服务器,保存所有的文件及版本,不同的地方在于,每个客户端在从服务器检出版本的时候,都会将全部版本库拷贝一遍,每一台机器上包含的都是一个完整的版本库。在这种情况下,如果服务器发生问题,那么每一个客户端,都可以轻易恢复整个版本库,杜绝了CVCS带来的风险。

Git的由来

Linux内核是一个大型项目,有无数的开发者工作在其中,从2002年开始,Linux内核项目使用了分布式版本控制系统BitKeeper,但是从2005年开始起,Linux内核开发社区和提供BitKeeper的商业公司关系恶化,Linux对BitKeeper的使用不再免费。于是这种状况激励了开发者(主要是Linus Torvalds)去研发属于自己的分布式版本控制系统。从2005年开始起,Git诞生了。

  1. 速度快;
  2. 设计简单;
  3. 对非线性开发的强大支持(数千分支并行开发);
  4. 完全分布式;
  5. 能管理大型项目,像Linux内核这样的(对数据占用空间和同步速度有较高要求);

Git与普通CVCS最大的不同在于,Git存储的不是文件的差异,而是存储文件本身。Git分布式特性决定了在Git中的绝大多数操作都是本地动作,就好像是在文件系统中读取一个文件那样简单,所以,也就有了近乎极限的速度。同时,这种特性还给用户提供了在断网情况下继续工作的可能性。

Git的安装

可能Git还有很多的好处,但是我估计看到此文的您跟我一样没有耐心去了解那些东西,赶快装上体验一下才比较实惠。不得不说,在Windows下安装*nix世界的软件是痛苦的,尤其是像Git这样年轻的软件,那过程真的是相当痛苦。

以前用过SVN,在Windows下的SVN有好多版本,最著名的就是TortoiseSVN,那真是无敌好用,基本上不要你对SVN的命令有什么详细的了解,你就可以非常愉快地使用了。真对Git,同样有一个TortoiseGit,但是,千万要小心了,这个可并非那么好用的。

首先,就算你想使用TortoiseGit,你也必须安装“原版”的Git。所以,不要抱有侥幸,请直接去http://git-scm.com/download下载for Windows的版本,我选择的是msysgit,这个东西很有特色,是在你系统上安装了一个MINGW32(Windows下的Linux命令环境),然后在这个环境下,用gcc现编译了一个git出来,所以官网特别强调了“这不是一个为Windows设计的第三方版本,而是git本身”。

装完这个的第二步才能轮到TortoiseGit等GUI扩展,这篇文章里暂时先不介绍了,因为我装完了以后,发现根本不能用。还是直接用git命令行比较好。

下载msysgit的时候,有好多版本可以选择,第一个原则是选择最新的,如果安装包表明是网络的,那么是通过安装过程中从网上下载源码的,否则就是带有源码拷贝的,我选了完整安装包,就是不需要网络下载的。双击安装,首先解压缩到磁盘上,自动启动MINGW32环境,开始编译,安装,都是自动的,全部结束后,会提示运行 /share/msysGit/initialize.sh,在msysgit目录下运行msys.bat,你会得到一个命令行,然后执行:

cd /share/msysGit/

./initialize.sh

以上两行命令执行后,会开始联网下载若干命令,把整个msysgit目录都纳入到了git的管理之下,现在刚开始学,我想这个东西不用管了,执行了命令成功后,就算是有了一个可以开始实践的平台了。