共计 1495 个字符,预计需要花费 4 分钟才能阅读完成。
git 是能够离线操作的,包含 ”git add”、”git commit” 等很多命令都能离线执行,所以这些命令波及的数据必定都是有本地存储的,比方 commit 的 id、message、author,历史批改的文件等,那么这些数据是存储在哪里的?答案是.git 文件。
上图展现了.git 下的所有文件,上面对 index,objects,HEAD,refs 这些文件夹剖析。
.git/index
通过 ”git add” 命令能够把更新的文件退出到暂存区,能够认为 index 是暂存区的存储文件,index 包含了退出到暂存区的文件以及未更新的文件,这些文件通过 hash 指向和文件门路代表。
- 在工作区对 add-me 文件进行了批改。(M 代表了批改,第二列的 M 代表是未退出暂存区的)
- 通过“git ls-files -s”查看此时 index 文件(二进制的)的内容。第二列是 blob 类型的 hash,blob 我了解就是门路类型的,第四列是文件门路和名称。
- 通过 git add add-me 把文件存入暂存区。(M 色彩变了并且跑到第一列代表在暂存区然而未退出本地库)
- 此时的 index 文件内容,看 add-me 对应的文件曾经更新了。
尽管看到 hash 的确扭转了,然而这个 hash 是如何映射文件内容的呢,看上面 objects 的介绍。
.git/objects
说是数据对象比拟形象, 其实就是二机制文件,蕴含三种类型的内容。
- commit 类型的, 其 hash 值的前两位定义为文件夹名称,后 38 位定义为文件名称,内容是 commit 的 message、author、parent、tree 等信息。
a. 执行 ”git log –pretty=raw” 能够看最近的提交日志。
b. 这些信息就是记录在 objects 文件夹下的,咱们试着找 commitID 为“e4a4482cf8163dadf861161803ea06460c5940b5”对应的文件。
c. 通过 ”git cat-file -t “ 查看 hash 类型。
d. 通过 ”git cat-file -p” 查看文件内容,正是 git log 打印的。
- blob 类型的,也就是文件门路和文件名,hass 值在 objects 中也是前两位对应文件夹后 38 位对应文件名称。
a. 执行“git ls-files -p”查看 index 文件内容。
b. 查看 hash 类型。
c. 在 objects 中的地位。
d. 查看下文件内容, 正是退出到暂存区中的内容。
- tree 类型的,也就是每次提交都会通过一个 tree 蕴含本次提交波及的所有文件。
a. 同样通过 ”git log –pretty=raw” 找一个 tree 类型的 hash。
b. 查看 hash 类型。
c. 查看 objects 中的地位。
d. 同样的查看文件内容,能够看到包含了本次更新和未更新的所有文件的 blob hash。
.git/HEAD,.git/ref/head/master
这俩放在一块是因为在应用时 HEAD 和 refs/head/master 是等效的,另外 master 是 refs/head/master 的 v 简写也是等效的。看下 HEAD 文件的内容。
refs/head/master 文件的内容是一个 commit 类型的 hash.
在 log 中查看下这个 hash。原来 HEAD、master 和 refs/head/master 都存储着咱们最近一次提交的 commID。
上帝视觉
咱们离线操作无非是工作区、暂存区、本地库,暂存区对应的文件的 hash 就存在 index 中;本读库对应的内容的 hash 存在 objects 中 hasn 类型为 tree 和 commit 类型的文件中;objetcs 中的 hash 类型为 blob 的文件则存储了咱们所有文件,包含在暂存区和曾经 commit 的。
正文完