理解 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 实验中验证。