my-git

Git Mental Model

English

这篇是 Git 心智模型系列的总入口。四区域模型适合快速判断日常操作,更深入的系列会从快照、对象、引用和历史变化解释 Git 为什么这样工作。

先了解为什么在 AI 时代学 Git,再打开交互学习。完整学习路径把十个递进主题的文章、交互和临时仓库实验放在同一顺序中。知识地图说明这条原理路径在什么情况下进入一次变更或协作决策。

旗舰系列

  1. 快照与状态:HEAD、Index 与 Working Tree · 交互 · 实验
  2. 对象图:blob、tree 与 commit · 交互 · 实验
  3. Index 是下一次 commit 的草稿 · 交互 · 实验
  4. 引用、HEAD 与身份 · 交互 · 实验
  5. 可达性、reflog 与恢复 · 交互 · 实验
  6. Merge 先找共同祖先,再合并两条历史 · 交互 · 实验
  7. Rebase 重放变化,分支引用指向新历史 · 交互 · 实验
  8. 远端是另一仓库,origin/main 是本地记录 · 交互 · 实验
  9. Worktree 共享对象,隔离检出状态 · 交互 · 实验
  10. 逻辑快照与物理存储是两层问题 · 交互 · 实验

第一章通过同一个文件的三个版本,演示 git add 和 git commit 实际记录什么,并提供交互演示和可运行实验。

第二章沿 commit 进入对象库,拆解 blob、tree 与 commit 的责任边界,并提供对象图交互演示和可运行实验。

第三章深入 Index,演示部分暂存、git diff --cached、安全取消暂存与冲突 stage 1、2、3,并提供Index 草稿交互演示和可运行实验。

四区域快速模型

理解 Git,先理解四个区域:

working tree -> index -> local repository -> remote repository

Working tree

你正在编辑的文件。

查看:

git status

Index

也叫 staging area,表示下一次 commit 会包含什么。

git add <file>
git diff --cached

Local repository

本地 commit 历史。

git log --oneline

Remote repository

远端仓库,比如 GitHub 上的 origin。

git fetch
git pull --rebase
git push

Key idea

这张图是操作概览,不表示文件只能处于一个区域,也不表示每次操作都把文件搬走。工作区、Index 和 HEAD 可以同时表示不同版本;远端也是一个仓库,拥有自己的对象和引用。

先比较版本和引用,再判断操作会改变什么。分支是指向 commit 的引用,commit 关联快照;不要把分支理解成另一份目录。

常见命令对应关系

命令 主要影响
git add 工作区 -> 暂存区
git commit 暂存区 -> 本地仓库
git restore 丢弃或恢复工作区内容
git restore --staged 默认用 HEAD 恢复 Index,Working Tree 保持不变
git push 本地仓库 -> 远端仓库
git fetch 远端仓库 -> 本地远端引用
git pull fetch + merge 或 fetch + rebase

为什么这个模型重要

很多 Git 事故都来自没有判断清楚当前改动在哪个区域。

例如:

先判断区域,再选择命令,是 Git 排错的第一原则。

延伸阅读