起因
虽然已经熟悉 Git 各种命令行操作,但还是被一种莫名的内驱力推动着,去系统地了解 Git 的底层原理。
Git 本质上不是“版本控制软件”。
它更像:一个基于 immutable object + 指针的数据库。
Git 的数据结构本质
计算机的一切都是数据结构,一切实现都基于数据结构。
Git 也不例外——它的核心就是 .git 目录下的那套对象存储机制。
commit、tree、blob——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 | # 压栈:保存当前修改 |
理解了这一点,stash 系列命令就不再是需要死记硬背的操作,
而是栈这一经典数据结构的自然体现。
Git学习推荐资源
- 廖雪峰的 Git 教程——适合快速入门,覆盖面广
- Pro Git——Git 官方书籍,系统全面
- git-from-the-bottom-up——从底层构建理解 Git
- 原来我一点也不懂 Git——B 站视频,根据
.git目录讲解 Git 的本质
总结
很多工具我们用了很久,
但只有理解了它的数据结构和底层设计,
那些“记不住”的命令才会真正变得自然而然。