工做区就是你在电脑里能看到的目录,好比你的项目目录。git
工做区下面有一个隐藏目录.git目录,这个.git目录不算工做区,它是Git的版本库,它存储变化日志及版本信息。学习
前面咱们讲Git的基本使用的时候,咱们提到了一个暂存区(stage, 或称为 index)的概念,当时怕你们被新概念吓怕,因此没有细细的讲,其实暂存区是Git最成功的设计之一,也是最难理解的部分,下面咱们经过一个例子好好的分析学习一下暂存区。设计
当执行 "git status" 命令扫描工做区改动的时候,先依据.git/index文件中记录的已跟踪的文件的时间戳、长度等信息判断工做区文件是否改变。若是工做区的文件时间戳改变,说明文件的内容可能被改变了,这个时候就须要打开文件,读取文件内容,和更改前的记录的原始文件相比较,判断文件内容是否被更改。若是文件内容有改变,则将该文件新的时间戳记录到.git/index文件中。所以.git/index的时间戳也跟着变化了。为何要这样作?由于判断文件是否更改,使用时间戳、文件长度等信息进行比较要比直接经过文件内容比较要快的多,因此Git这样的实现方式可让工做区状态扫描速度更快。3d
下图展现了工做区、版本库中的暂存区和版本库之间的关系。指针
对上图的说明:日志
.git/index实际上就是一个包含文件索引的目录树,像是一个虚拟的工做区。在这个虚拟工做区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的内容并不存储其中,而是保存在Git对象库(.git/objects)中,他们经过这个索引和对象实体是对应着的。从上面的图咱们能够看出:对象
【总体】Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。blog
add后:索引
再执行git commit就能够一次性把暂存区的全部修改提交到分支it
一旦提交后,若是你又没有对工做区作任何修改,那么工做区就是“干净”的。
如今版本库变成了这样: