大多数人对 Git 的心智模型是「它保存差异」:改文件、提交,它算出新旧文件的 diff 存成补丁。CVS 和 SVN 确实这么干,但 Git 完全不是——它不存补丁,内部甚至没有「文件重命名」这个概念。git diff 显示的绿加红减是当场算出来的呈现。作者把 .git 拆开讲:核心是 .git/objects 这个内容寻址的键值库,只有四种对象——blob 存文件原始字节(不含文件名、路径、权限),tree 表示目录、把文件名与权限映射到 blob 或子 tree 的哈希,commit 是指向根 tree 的快照指针加上父提交、作者、提交者、说明,附注标签则是永久的具名指针。理解了这层,rebase、reset --mixed、detached HEAD 就不再像雷区:它们只是在这张有向无环图上移动引用。