理解 Git 的设计

理解 Git,才能决定如何使用它。

Agent 可以代劳命令。理解让你看见选择,判断结果,并在出错时找到恢复的方向。

从一个文件开始。先猜会发生什么,再播放过程,最后检查自己的解释。下面三个实验,把 Git 的设计和你与 Agent 协作时的判断连在一起。

保存了文件,就进入历史了吗?

你改了一个文件,暂存它,又继续改了一次。此时执行普通的 git commit,会记录哪一个版本?观察下面三个位置,它们各有职责。

启用 JavaScript 可操作动画;也可以直接阅读下方文章和实验。

HEAD 标识当前提交,Index 描述下一份快照,工作区是你正在编辑的文件。已经暂存的版本,会一直保留到你再次更新 Index。

想一想:文件已经是 version=3,新提交里是什么?

是 version=2,因为暂存的是这个版本。后续编辑仍留在工作区。Agent 说“已保存”,还不足以证明哪些内容能从提交中恢复。

一个名字,如何找到一份内容?

分支保存一个 commit ID,commit 引用根 tree,tree 的条目把名字连到下一层 tree 或 blob。顺着这条路径,每读到一个对象,才知道接下来去哪里找。

启用 JavaScript 可操作动画;也可以阅读下方文章。

试着改选另一个文件。两个条目都指向 B1:不同路径可以共享相同内容。blob 不保存文件名。图里画的是对象关系,实际磁盘存储还可能使用压缩和差量编码。

想一想:删掉 main,会立刻抹掉快照吗?

删除分支移除的是引用。其他引用或 reflog 可能仍保留该提交。能否恢复取决于可达性和保留情况;不可达对象不会被承诺永久保存。

一个文件,也可以有两种意图。

Agent 修复了超时配置,又顺手打开调试日志。你只想接受修复。Index 让你在同一个文件里选择改动,并在提交前检查完整草稿。

启用 JavaScript 可操作动画;也可以阅读下方文章。

草稿里包含整个文件,也包含没改过的配置。部分暂存决定哪些编辑进入这份草稿。在真实仓库中,用 git diff --cached 检查下一次提交相对 HEAD 到底改了什么。

想一想:取消调试改动的暂存,会丢掉编辑吗?

不会。git restore --staged 更新 Index,工作区保持不变。你可以保留这处编辑,另做决定。恢复工作区文件是另一种操作,风险也不同。

继续走完整条心智模型。

后七章延续同一种阅读节奏:先预测,改变一个条件,播放五步状态,再到可删除的 Git 实验中验证。

把理解,带回真实工程。

接受 Agent 的改动前,问清提交边界、验证版本和恢复范围。Git 记录版本;测试、审查、权限和发布系统共同构成变更控制。

AI 会操作,人为什么还要学?这个仓库的出发点 ↗ 完整学习路径原理、实践与待补全内容 ↗ 走完一次 Agent 变更验收意图 → 证据 → 判断 ↗