git的三个区域与.git目录解析【图文经典版】

git三个区域与文件的三种状态

一、git的三个区域

一、Git 的工做目录git

二、暂存区域web

三、以及本地仓库shell

二、文件的三种状态

对于任何一个文件,在 Git 内都只有三种状态:数据库

一、已修改(modified)    --> Git 的工做目录安全

二、已暂存(staged)        -->暂存区域spa

三、已提交(committed) -->本地仓库指针

已修改表示修改了某个文件,但尚未提交保存;对象

已暂存表示把已修改的文件放在下次提交时要保存的清单中。ip

已提交表示该文件已经被安全地保存在本地数据库中了;rem

由此咱们看到 Git 管理项目时,文件流转的三个工做区域:Git 的工做目录,暂存区域,以及本地仓库。

 

 

.git文件夹目录结构

1 、hooks文件夹:

    这个目录存放一些shell脚本,能够设置特定的git命令后触发相应的脚本;

    在搭建gitweb系统或其余git托管系统会常常用到hook script。

二、info文件夹:

     包含git仓库的一些信息

3 、logs文件夹:

     保存全部更改的引用记录,继续打开logs文件夹,有refs文件夹和HEAD文件

    请看下图中

(1)HEAD文件

        主要记录每次的变动操做,全部类型的变动都会记录的哦,

         git reflog命令查询出的列表就是HEAD中存储的列表

(2)继续打开refs文件夹,能够看到heads文件夹、remotes文件夹和stash文件

    I : stash文件存储的是全部你使用git stash命令暂存的记录,是一个列表。使用git stash list时,查询出的列表就是从stash中取出来的。

    II:heads文件里面存储的是一系列的本地分支的对象,每一个对象的文件名就是本地的一个分支名,使用git branch查看本地分支命令时,查询出的全部本地分支就是取的heads文件夹下全部文件的名称。

    III:remotes文件夹里存储的是远端的一系列分支的对象,每一个对象的文件名称就是远端的一个分支名称,使用git branch -a查看远端分支命令时,查询出的全部本地分支就是取的remotes文件夹下全部文件的名称。

四、objects文件夹

该目录存放全部的Git对象,对象的SHA1哈希值(一共40位)的前两位是文件夹名称,后38位做为存在相应文件夹下对象的文件名。

好比0b这个文件夹,它里面有一系列git对象(也就是文件),里面全部文件的38位的名称加上0b,就组成原来的40位的哈希值了。

更近一步说,咱们每次提交新文件到git上时,这时会根据该文件内容计算生成一个40位的哈希值,假如生成的是0c7bcc3f8f1c5311d06e3067f7f7dddecb8668fe,这个文件的存储方式就是先截取0c做为文件夹名称,而后后面的38位7bcc3f8f1c5311d06e3067f7f7dddecb8668fe做为文件名称,存储在0c文件夹下。

若是这时你又提交了一个文件或者修改了一个文件碰巧又生成一个以0c开通的哈希值,那么这个时候就会直接截取该哈希值的后38位做为该次生成的git对象的文件名,存储在原来已经存在的0c文件夹下。

五、refs文件夹

(1)heads文件夹

        该文件夹存储的是全部的本地分支文件,每个本地分支文件中,存储的是一个哈希值,每一次commit都是生成一个对应的哈希值,而后用此次新生成的哈希值,替换掉原来这个分支文件中的哈希值。

以下三张图,红色的表明新提交的三个文件,而后

    

(2)stash文件

        该文件夹是使用git stash命令时,会将生成的git对象的哈希值存储到stash文件里,更进一步说stash文件中,就存了一个40位的哈希值。对应的git对象在objects文件夹里。使用git stash pop时,会先去stash文件中,找到该哈希值(或者也能够认为是指针),而后到对应的objects文件夹下,查找对应的git对象,将其中的数据取出来,转换成咱们能看懂的代码

        I、继续打开tags文件夹

            当使用git tag v1.0给当前分支,打上标签时,就会在tags文件夹下,生成对应文件,文件里存储的是当前分支所对应的哈希值,之后就可使用v1.0这个标签来代替分支名称,一般发布稳定的线上版本时,使用这种作法。方便之后查询,由于使用标签容易记,更简洁。

六、COMMIT_EDITMSG文件提交的是最近一次提交的描述信息

七、 config:这个是GIt仓库的配置文件

八、 description:仓库的描述信息,主要给gitweb等git托管系统使用

九、 index:这个文件就是咱们前面提到的暂存区(stage),是一个二进制文件

十、HEAD文件里面只存储了当前分支的关联

 

 

参考:

https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80

https://www.jianshu.com/p/25293009f738