Git 教学¶
这一部分从第一性原理解释 Git。目标不是教你背命令,而是让你真正理解:为什么 Git 的对象模型、暂存区、提交图、分支和合并会长成今天这样。
为什么要先学原理¶
很多人会用 Git,但对 Git 的理解停留在“背命令”:
git addgit commitgit checkoutgit merge
命令当然重要,但如果你不知道背后在变化的到底是什么,你就很难理解这些问题:
- 为什么
add不是“直接提交”; - 为什么
commit本身不保存分支名; - 为什么 branch 这么轻;
- 为什么 merge 有时候能自动完成,有时候会冲突;
- 为什么 Git 可以高效去重和传输历史。
这一部分讲什么¶
这一组页面会按顺序讲:
- Git 对象模型;
- Index 与暂存区;
- Commit 与 DAG 历史;
- merge 与冲突;
- packfile 与远端传输基础。
最重要的视角切换¶
学习 Git 时,最关键的一步是把脑子里的模型从“Git 管文件夹”切换成“Git 管对象和引用”。
Git 并不是以“项目目录名”或者“文件路径名”作为根本身份。它真正关心的是:
- 内容是什么;
- 内容组成了什么 tree;
- 哪个 commit 指向哪个 tree;
- 哪个 ref 指向哪个 commit。
一旦你完成这次视角切换,很多平时看起来神秘的行为都会变得可解释。
怎么读这一部分¶
建议按这个顺序读:
Git 对象模型Index 与暂存区Commit 与 DAG合并冲突Packfile
这条顺序和 Git 本身的结构是对齐的:先有对象,再有暂存区和快照,再有历史图,最后才有合并和传输。