(一)Git 目录
对于这些文件和目录,下面给出了一些基本的描述。
hooks:这个目录存放一些shell脚本,可以设置特定的git命令后触发相应的脚本;在搭建gitweb系统或其他git托管系统会经常用到hook script
info:包含仓库的一些信息
logs:保存所有更新的引用记录
objects:所有的Git对象都会存放在这个目录中,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
refs:这个目录一般包括三个子文件夹,heads、remotes和tags,heads中的文件标识了项目中的各个分支指向的当前commit
COMMIT_EDITMSG:保存最新的commit message,Git系统不会用到这个文件,只是给用户一个参考
config:这个是GIt仓库的配置文件
description:仓库的描述信息,主要给gitweb等git托管系统使用
index:这个文件就是我们前面提到的暂存区(stage),是一个二进制文件
HEAD:这个文件包含了一个档期分支(branch)的引用,通过这个文件Git可以得到下一次commit的parent
ORIG_HEAD:HEAD指针的前一个状态
(1.1)查看index文件内容(git ls-files --stage)
(1.2)查看HEAD指向的目录树(git ls-tree -l head)
(二)基本对象类型
Git中有四种基本对象类型,组成了Git更高级的数据结构:
blobs:每个blob代表一个(版本的)文件,blob只包含文件的数据,而忽略文件的其他元数据,如名字、路径、格式等。
trees:每个tree代表了一个目录的信息,包含了此目录下的blobs,子目录(对应于子trees),文件名、路径等元数据。因此,对于有子目录的目录,git相当于存储了嵌套的trees。
commits:每个commit记录了提交一个更新的所有元数据,如指向的tree,父commit,作者、提交者、提交日期、提交日志等。每次提交都指向一个tree对象,记录了当次提交时的目录信息。一个commit可以有多个(至少一个)父commits。
tags:tag用于给某个上述类型的对象指配一个便于开发者记忆的名字, 通常用于某次commit。
在.git/objects/中存储了所有的对象,如用命令($ find ./.git/objects -type f)
用命令:git cat-file -t <SHA1>,git cat-file -p <SHA1>可以分别查看对象的值和内容。一般地,使用SHA1值的前面几位(而不是全部)就可以区分不同的对象。
(2.2) 对象之间的关系链
从下图可以看出:
① add操作首次会添加一个index文件,在Git中将其定义为暂存区,实际是一个二进制文件存储内容为:工作区中需要版本控制的文件清单,格式见上图。
② 再次add会修改index文件。commit操作不会更改index文件。
③ 从图中可以看到在master分支上的一条提交链。每次commit都会产生tree,commit,blob彼此组成一个链式结构。(见图6-1)
(三)Git分支与对象的关系
①:创建分支(bra)时相当于在/refs/heads目录下生成一个bra文件用来记录最后一次提交(commit)的ID。
②:首次创建分支时/refs/heads/bra存的信息为基分支的最后一次提交ID
③:切换分支到bra时会改变.git/HEAD文件中的值:ref: refs/heads/bra
https://www.cnblogs.com/liyropt/archive/2012/12/11/2812194.html