1.2 Git简史
Git简史
就像生活里的很多重大事件一样,Git伴随着毁灭性的创新和激烈的争论而产生。linux内核是一个相当大范围的开源软件项目。在linux内核的很长一段时间(1991-2002)的维护
周期里,对软件的更新是通过补丁和归档文件进行提交的,在2002年,linux内核项目开始使用一个叫BitKeeper的分布式版本控制系统。
2005年,linux内核项目社和开发BitKeeper软件的商业公司关系破裂,免费使用该工具的权利被取消。通过使用BitKeeper时得到的一些教训直接导致linux开发社区成员们(尤其
是linux之父Linus Torvalds)开发自己的版本控制工具。新的系统设定了以下目标:
1、速度
2、简单的设计
3、对非线性开发的强力支持(数以千计的并行分支)
4、完善的分布式开发
5、能够高效地处理想linux内核这样的大项目(主要指数据大小,提交速度)
自从2005年问世,在保持原有的优点上,Git逐渐成熟并变得越来越好用。在处理大项目是他真的很快效率也很高,并且他拥有一个难以置信的非线性开发分支体系(见第三章)。
1.3 Git基础知识
接下来,简单地说,什么事Git?这部分是需要花费时间重点研究的内容,因为如果你明白了Git的工作原理,那么对你来说,在使用他的时候会变得非常容易。在你学习Git的时候
请将之前你学习和使用的版本控制系统从你的脑海中清除掉,比如 Subversion 和 Perforce。这样做可以避免在你使用他的时候产生的细微的困惑,Git存储和获取信息的方式和
其他系统比起来有很大的不同,尽管他们的用户界面如此相似。理解他们之间的不同之处有助于在你使用他的时候避免产生混淆。
快照,不再是差异
Git和其他版本控制系统(Subversion及其相关的系统)主要的区别在于他们获得数据的方式。简而言之,大部分的其他系统只是将基于文件的变化的一个列表存储起来。这些系统
(CVS, Subversion, Perforce, Bazaar等等)认为他们保存的信息应该以很多文件的集合和过去对这些文件所做的变更集的方式存在。如图1-4
图示1-4 其他系统倾向于基于文件原来版本的更改存储数据
Git并不认可和采用这种存储数据方式。相反,Git认为更应该像一个小型文件系统的快照方式存储他的数据,每次你使用Git提交或者保存你的项目状态的时候,这时基本就像给你所有的文件照了一张快照,存储
在系统里。为了保证高效,Git不会再次保存你没有作任何更改的文件,仅仅是对你先前存在的文件做了一个链接。Git认为他存储数据的方式更应像图1-5:
图示1-5 Git保存的是某个时间的快照
这是Git和其他几乎所有的VCS的区别。这促使Git重新考虑其他系统从以前的版本生成拷贝到新的系统中最版本控制产生的影响,这使Git更像是建立在一个小型的文件系统之上的强大的工具,而不是一个简单的VCS
在即将提到的Git的第三章节,我们将了解到在使用Git的处理数据的方式时会有多大的好处。
几乎每一个操作都是本地的
Git的大多数操作都是本地进行的,因为你几乎不需要从任何在互联网上的其他的电脑上获取信息。如果你使用的是CVCS系统,很多操纵经常出现延迟,那么Git这边会让你感受到非权势所能达到的神一般的处理速
度,因为你有一个完整的项目副本在你的本地磁盘上,而且大多数操作几乎没有延迟。
例如,查看项目的历史记录,Git不需要跑到服务器上获取历史信息并将它展示给你,很容易地可以直接从你本地数据库中读取到。这意味着你可以即刻看到历史信息。如果你想查看当前版本的文件和一个月之前的
有什么区别的话,Git可以帮你查阅一个月之前的文件并与本地文件比较其差异性,而不需要去问远程服务器或从服务器拉到本地进行比较。
这也意味着如果你离线或关闭VPN你能做很少的事情。如果你坐飞机或坐火车想处理一些工作,那么你只能等到连接上网络才能上传。如果你回到家无法连接到VPN客户端,你仍然可以工作。在许多其他的系统中这
样做是不可能或者很痛苦。例如,在某种程度上,你没连接服务端你很难做很多事,在Subversion 和 CVS里你可以编辑文件,但是你不能提交你的更改到数据库(因为数据库是离线的)。这看上去不像是硬伤,
但是你可能会遭受他带来的很大的影响。
Git具有完整性校验功能
存储数据之前一切Git签出和提交操作都要进行的校验,这意味着在Gi不知道的情况下它是不可能改变任何文件或目录的内容。这个功能是内置在Git的最底层,并且在他的理念里是不可或缺的。你不可能在提交过程
中丢失信息或获得文件而Git却不能够检测到它。
Git采用的校验机制叫做 SHA-1 的哈希验证函数。这是一个由40个字符(0–9 and a–f) 组成的一个十六进制字符字符串,基于文件或目录内容进行比较。一个sha - 1哈希校验码看起来像这样:
24b9da6552252987aa493b52f8696cd6d3b00373
您将看到这些哈希值无处不在因为Git使用太多了。实际上,Git不按照文件的名字存储每个文件,而是以他们内容的哈希值存储在可寻址数据库中。
通常Git只添加数据
你用Git所做的操作,几乎都保存在了Git的数据库中。除了让系统做撤销和删除数据操作外你很难让系统做其他事情。在你没有提交之前,在任何的VCS中你可以放弃和把更改弄的乱七八糟。但是当你向Git提交一
个快照之后,你想丢失数据都难,特别是你还经常备份数据到另一个数据库中。这会让你在使用Git的时候感到非常快乐,因为我们可以不用冒着把事情搞砸的风险做测试。如果你想更深入的了解Git是如何存储和恢
复数据的,请看第九章。
三种状态
现在,请注意,接下来你想毫无困难地使用Git的话,请记住这个关于Git的重要知识。Git可以是你的文件处于三个主要的状态:committed(已提交), modified(已修改)和已暂存(staged)。Committed意
味着你已经安全的将数据存储到你的本地数据库中了。Modified意味着你已经修改了文件但是还没有提交他到你的数据库。Staged是指你在文件的当前版本做了一个修改的标志这会记入你的下一个快照提交中。
这指出了Git项目中的三个主要部分:Git目录,正在工作的目录,分级区。图示1-6:
图示1-6 Git目录,正在工作的目录,分级区
Git目录是Git存储您的项目的元数据和数据库对象的,这是Git重要的组成部分,而且是你从别的电脑拷贝的一个仓库。
工作目录是你项目版本的一个单独的签出。这些文件都已经被从Git的压缩数据库中签出并放到磁盘上供您修改使用。
分级区(待操作区)是一些简单的文件,通常包含在Git目录中。这里存储了你在提交下一个快照时所做的操作信息。他有时被称作,但标准的叫法是已载入。
Git的基本的工作流程如下:
1、在你的工作目录中修改文件
2、你组织文件,添加快照到你的staging区域。
3、你做一个提交动作,那些在操作区的文件和存储的快照将被永远的存放到Git目录中。
如果在Git目录中出现了一个新的版本的文件,说明你提交成功了。如果文件已经修改并且被提交到了操作区,说明他已经被组织了。但是如果文件在签出以后被修改了单位被提交到staging区,那他就处于修改
状态。在第二章,你会对这些状态了解更多,如何使用这些状态,或者直接跳过staging区。