从根本上来说,Git是一个内容寻址文件系统,并在此之上提供了一个版本控制系统的用户界面,它是一个很是强大且易用的工具,理解Git的工做原理,可以帮助咱们更容易学习和使用Git。git
本文不会像书籍里那样,一条条讨论checkout、branch、remote等诸如此类动词形式的高层命令和底层命令,本文主要从宏观方向传达Git的思想和工做原理,可以使初学者更加理解,更利于学习。数据库
Git 和其余版本控制系统的主要差异在于,Git 只关心文件数据的总体是否发生变化,而大多数其余系统则只关心文件内容的具体差别。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件做了更新,以及都更新了哪些行的什么内容:安全
Git 并不保存这些先后变化的差别数据。实际上,Git 更像是把变化的文件做快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍全部文件的指纹信息并对文件做一快照,而后保存一个指向此次快照的索引。为提升性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照做一连接。Git 的工做方式就以下图所示。工具
这是 Git 同其余系统的重要区别。它彻底颠覆了传统版本控制的套路,并对各个环节的实现方式做了新的设计。Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不仅是一个简单的 VCS。性能
Git 和其余版本控制系统的一个不一样之处就是有暂存区的概念。学习
在电脑中能看到的目录,好比我创建的gittest就是一个工做区设计
工做区中的隐藏目录.git
,就是Git的版本库。3d
Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。版本控制
回忆在我上一篇博客中提到的将文件添加到版本库的流程图:指针
经过以上两幅图不难看出,须要提交的文件通过add后先都放到暂存区index(或者叫stage)中,而后通过commit指令,一次性提交暂存区的全部修改到head。一旦提交后,暂存区清空,同时若对工做区没有作任何修改,那么工做区就是干净的(working directory clean)
对任何一个文件,在Git内都有三种状态:
所谓的暂存区域只不过是个简单的文件,通常都放在 Git 目录中。有时候人们会把这个文件叫作索引文件,不过标准说法仍是叫暂存区域。
咱们能够从文件所处的位置来判断状态:
当一个新目录或已有目录执行git init
时,Git会建立一个.git
目录。这个目录包含了几乎全部Git存储和操做的对象。若想备份或复制一个版本库,只需把这个目录拷贝至另外一处便可。对于一个全新的版本库,该目录结构以下所示:
关于Git底层命令和高层命令的原理讨论,很大一部分都在这个目录中,要想了解具体的原理,能够看这本书,这里仅仅列出了每部分的功能,有个大致了解。
有了上述介绍,咱们能够对 Git 的命令有更深的理解,这里以将文件添加到代码库为例进行分析:咱们都知道须要两步,第一步add,第二步commit,但为何要分两步呢?每一步都作了什么呢?
(1)git commit -a:至关于运行 git add 把全部当前目录下的文件加入暂存区域再运行 git commit
(2)git commit <file_name>:进行一次包含最后一次提交加上工做目录中文件快照的提交,而且文件被添加到暂存区域
(3)git checkout HEAD -- <file_name>:回滚到复制最后一次提交
做者:sunnyaxin连接:http://www.jianshu.com/p/619122f8747b來源:简书著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。