Git内部原理

清夏晚风

Git对象模型

核心对象关系

1
2
3
4
5
6
graph LR
commit((Commit)) --> tree1[Tree]
tree1 --> blob1[Blob: file1.txt]
tree1 --> tree2[Tree: dir1]
tree2 --> blob2[Blob: file2.txt]
commit --> parent[Parent Commit]

对象类型详解

类型 存储内容 SHA示例
Blob 文件数据 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
Tree 目录结构(文件名+模式) 92ec2f3e1a88e6a6d9c5f7e3d4a0d8c7b4e5f6a1
Commit 提交元数据 3f7d2e1a4d5c9e6f0a8b7c6d5e4f3a2b1c0d9e8f
Tag 标签引用 refs/tags/v1.0.0

引用机制

1
2
3
4
5
6
7
8
# 查看引用文件
ls .git/refs/
├── heads/ # 分支指针
├── tags/ # 标签指针
└── remotes/ # 远程跟踪分支

# HEAD文件内容
cat .git/HEAD # ref: refs/heads/main

数据存储示例

1
2
3
4
5
6
7
8
9
10
# 手动创建对象
echo 'test content' | git hash-object -w --stdin
# 输出:d670460b4b4aece5915caf5c68d12f560a9fe3e4

# 查看对象内容
git cat-file -p d67046
# 输出:test content

# 查看对象类型
git cat-file -t d67046 # 输出:blob

垃圾回收机制

1
2
3
4
5
6
7
# 手动触发GC
git gc --auto

# 查看对象存储
du -sh .git/objects/
├── 17/ # 松散对象
└── pack/ # 打包文件

数据恢复原理

1
2
3
4
5
6
# 查找丢失的提交
git fsck --lost-found

# 从reflog恢复
git reflog show --all
git reset --hard HEAD@{2}

对象存储结构

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看对象存储路径
.git/objects/
├── 12/3456... # 前两位作为目录
└── pack/ # 打包优化后的对象

# 对象寻址过程
输入:commit的SHA1值

取前两位作为目录名

在objects目录下查找对应文件

zlib解压获得实际内容

引用更新机制

1
2
3
4
5
6
7
8
9
10
sequenceDiagram
participant W as 工作区
participant I as Index
participant O as ObjectDB
participant R as Refs

W->>I: git add
I->>O: 创建blob对象
W->>O: git commit
O->>R: 更新HEAD引用

数据恢复实战

场景:误删分支

1
2
3
4
5
6
7
8
# 1. 查找最后提交的SHA
git reflog show --all | grep 'commit: Your message'

# 2. 重建分支
git branch recovered-branch 8123abc

# 3. 验证内容
git checkout recovered-branch

场景:硬重置后恢复

1
2
3
4
5
6
7
8
# 查看操作记录
git reflog
# 输出示例:
# 8123abc HEAD@{0}: reset: moving to HEAD~2
# 9f4d5e6 HEAD@{1}: commit: Add new feature

# 恢复到指定位置
git reset --hard HEAD@{1}

底层命令演示

手动创建提交

1
2
3
4
5
6
7
8
9
10
11
12
# 创建blob对象
echo 'Hello' | git hash-object -w --stdin

# 创建tree对象
git update-index --add --cacheinfo 100644,2e65efe,hello.txt
git write-tree

# 创建commit对象
echo "First commit" | git commit-tree $(git write-tree)

# 更新分支引用
git update-ref refs/heads/main 3f7d2e1

仓库格式版本

根据Git官方文档最新规范:

1
2
3
4
5
6
7
8
# 查看当前仓库格式版本
git config core.repositoryformatversion

# 典型配置文件内容
[core]
repositoryformatversion = 1
filemode = true
bare = false

版本演进规则

1
2
3
graph LR
v0[Version 0] -->|扩展机制| v1[Version 1]
v1 -->|增量升级| v2[Version 2 (规划中)]

版本1核心特性

  1. 必须严格处理extensions.*配置项
  2. 支持分阶段升级策略
  3. 增强的兼容性检查机制

扩展处理示例

1
2
3
4
5
# 典型扩展配置
[extensions]
objectFormat = sha256
worktreeConfig = true
preciousObjects = true

当检测到未实现的扩展时,Git会报错:

1
fatal: 未知扩展 'experimentalFeature',操作终止
  • Title: Git内部原理
  • Author: 清夏晚风
  • Created at : 2026-01-14 14:55:07
  • Updated at : 2026-01-14 14:55:07
  • Link: https://blog.kimikkorow.eu.org/版本控制管理/Git/Git内部原理/
  • License: This work is licensed under CC BY-NC-SA 4.0.