关于 Git 的一些理解——从命令到本质

起因

虽然已经熟悉 Git 各种命令行操作,但还是被一种莫名的内驱力推动着,去系统地了解 Git 的底层原理。

Git 本质上不是“版本控制软件”。
它更像:一个基于 immutable object + 指针的数据库

Git 的数据结构本质

计算机的一切都是数据结构,一切实现都基于数据结构。
Git 也不例外——它的核心就是 .git 目录下的那套对象存储机制。

committreeblob——Git 的本质就在于 .git 目录里这些对象的组织方式。

  • blob:保存文件内容本身
  • tree:保存目录结构,以及文件名到 blob 的映射
  • commit:保存一次快照,指向对应的 tree,并记录父 commit、作者和提交信息

所以 Git 记录的不是“文件改了几行”这种直觉上的差异,而是一组对象之间的引用关系。
版本历史也不是线性的文本记录,而是一张由 commit 串起来的对象图。

stash 与栈

git stash 为例,它保留工作记录使用的其实是的数据结构:

  • git stash:把当前工作区修改保存成一个 commit-like 对象,压入栈顶(push)
  • git stash pop:恢复并删除栈顶元素(pop = 恢复 + 删除)
  • git stash apply:相当于 peek(),不删除,只取出来用
1
2
3
4
5
6
7
8
9
10
11
12
13
# 压栈:保存当前修改
git stash

# 查看栈中内容
git stash list
# stash@{0}: WIP on main: a1b2c3d some commit
# stash@{1}: WIP on main: e4f5g6h another commit

# 出栈:恢复最近一次 stash 并删除
git stash pop

# 只读:恢复最近一次 stash 但不删除
git stash apply

理解了这一点,stash 系列命令就不再是需要死记硬背的操作,
而是栈这一经典数据结构的自然体现。

Git学习推荐资源

  1. 廖雪峰的 Git 教程——适合快速入门,覆盖面广
  2. Pro Git——Git 官方书籍,系统全面
  3. git-from-the-bottom-up——从底层构建理解 Git
  4. 原来我一点也不懂 Git——B 站视频,根据 .git 目录讲解 Git 的本质

总结

很多工具我们用了很久,
但只有理解了它的数据结构和底层设计,
那些“记不住”的命令才会真正变得自然而然。