Git原理-元数据之谜

2024/06/06 | 字数1163 | 阅读3分钟


有没有想过Git是如何管理历史数据的,是如何管理文件版本的,是如何管理commit信息的?一切还得从“头”开始说起,看看下面这张图: git meta data

这张图中包含了我们需要关注的所有重点元数据信息(位于.git/目录下):


有了上面的这些元数据,我们就可以给出上面问题的答案了:

  1. git首先读取HEAD文件的内容,进而得知需要获取refs/heads/main引用文件的内容,读取main文件,得到最新的commit对象;
  2. 通过这个commit对象,就可以拿到这个版本的所有信息:是谁提交的代码,什么时间提交的,提交消息填写的什么,然后通过commit对象的tree对象,就可以拿到那个版本对应的所有文件快照;
  3. 然后通过当前commit对象的parent值,就能拿到上一个版本的commit对象;然后通过这个commit对象,就能拿到上一个版本的所有信息。
  4. 重复上述步骤2&3,遍历所有的从HEAD到最后一个commit的对象,就能遍历仓库的所有版本记录。

下面是这些文件的内容参考,让各位有一个直观的印象(高亮的行是执行的命令,随后是命令的输出内容):

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
## 查看HEAD引用内容
cat .git/HEAD
ref: refs/heads/main

## 查看main引用文件内容
cat .git/refs/heads/main
ad6a880ba3d1e88f9a9f816f2a24a642c0aa3aa6

## 查看commit对象内容
git cat-file -p ad6a880ba3d1e88f9a9f816f2a24a642c0aa3aa6
tree 77c46e4bc3dc28f5f3a1c6b51b83305a0734276f
parent 65c0a3147edff1925eba68973ccb682c9bcc6873
author ticktechman <geek.wystan@gmail.com> 1717643056 +0800
committer ticktechman <geek.wystan@gmail.com> 1717643056 +0800

git meta data v1

## 查看tree对象内容
git cat-file -p 77c46e4bc3dc28f5f3a1c6b51b83305a0734276f
100644 blob 1b5270a5055e8b37f5801394e29f315e6b01f580	.gitignore
100644 blob 305f51ce023be0029eff07f6a8dc324a00b98a93	README.md
040000 tree 669afee07a4c86aac5a9934a4a972927043f62eb	archetypes
040000 tree 88812a14b70a756a670787764657d24ba2583485	assets
040000 tree ef1c7bf66dc7b746f05c0c3e0abc6578f2096df8	content
100644 blob 9593c798833adb0dfca8a6963d16c3f08b419f3e	hugo.toml
040000 tree 161d7c97059307c472c6f939f80116d59f640efa	i18n
040000 tree e6b848fa0e7e4296209a3620c4a898c2e6faa3a8	layouts
100644 blob 1eb7a9ce6256f978f38514e0ad8781b913915357	package-lock.json
100644 blob 460d9cbfecab7678b20286021f553e830b06a777	package.json
040000 tree 98ecb18fc5535988822ba3eba79869b42652e8ec	scripts
040000 tree 2778eba01f886d13326084ba5821ddb8f407f572	static
100644 blob 0f178be6c6b0f846d0831634f84ff1d4dcd4c629	tailwind.config.js
040000 tree 377ebf1206616cb63a011b3d055aaadd445d0e0c	ticktechman.github.io
100644 blob 14d52ad30454b8b7ccf40e4b0590564899516442	zshrc

## 查看某个文件内容:.gitignore
git cat-file -p 1b5270a5055e8b37f5801394e29f315e6b01f580
**/node_modules
**/.DS_Store
.hugo_build.lock
public
static/assets/css/style.css

上面用到了一个git底层命令:git cat-file -p <SHA1>用来显示对象对应的文件内容,这个命令可以自动识别对象类型,并解析文件。

上一篇:Git进阶-拆分仓库 下一篇:Git原理-解密暂存区

【文章不错,鼓励一下】