Git的使用---5. 工做区、暂存区和仓库

1. Git的提交流程

工做区 -- add -- > 暂存区 -- commit -- > 版本库
工做区

工做区就是你在电脑里能看到的目录,好比你的项目目录。git

版本库

工做区下面有一个隐藏目录.git目录,这个.git目录不算工做区,它是Git的版本库,它存储变化日志及版本信息。学习

前面咱们讲Git的基本使用的时候,咱们提到了一个暂存区(stage, 或称为 index)的概念,当时怕你们被新概念吓怕,因此没有细细的讲,其实暂存区是Git最成功的设计之一,也是最难理解的部分,下面咱们经过一个例子好好的分析学习一下暂存区。设计

当执行 "git status" 命令扫描工做区改动的时候,先依据.git/index文件中记录的已跟踪的文件的时间戳、长度等信息判断工做区文件是否改变。若是工做区的文件时间戳改变,说明文件的内容可能被改变了,这个时候就须要打开文件,读取文件内容,和更改前的记录的原始文件相比较,判断文件内容是否被更改。若是文件内容有改变,则将该文件新的时间戳记录到.git/index文件中。所以.git/index的时间戳也跟着变化了。为何要这样作?由于判断文件是否更改,使用时间戳、文件长度等信息进行比较要比直接经过文件内容比较要快的多,因此Git这样的实现方式可让工做区状态扫描速度更快。3d

下图展现了工做区、版本库中的暂存区和版本库之间的关系。指针

image

对上图的说明:日志

.git/index实际上就是一个包含文件索引的目录树,像是一个虚拟的工做区。在这个虚拟工做区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的内容并不存储其中,而是保存在Git对象库(.git/objects)中,他们经过这个索引和对象实体是对应着的。从上面的图咱们能够看出:对象

  1. 图中左侧为工做区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所表明的目录树。
  2. 图中咱们能够看出此时"HEAD"实际是指向master分支的一个“游标”。因此图示的命令中出现HEAD的地方能够用master来替换。
  3. 图中的 objects 标识的区域为Git的对象库,实际位于 ".git/objects" 目录下
  4. 当对工做区修改(或新增)的文件执行"git add"命令时,暂存区的目录树被更新。同时工做区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的id被记录在暂存区的文件索引中
  5. 当执行提交操做(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会作相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
下面咱们在过一遍流程:

【总体】Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。blog

image

add后:索引

image

再执行git commit就能够一次性把暂存区的全部修改提交到分支it

一旦提交后,若是你又没有对工做区作任何修改,那么工做区就是“干净”的。

如今版本库变成了这样:

image

相关文章
相关标签/搜索