这篇是 Git 心智模型系列的总入口。四区域模型适合快速判断日常操作,更深入的系列会从快照、对象、引用和历史变化解释 Git 为什么这样工作。
第一章通过同一个文件的三个版本,演示 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
你正在编辑的文件。
查看:
git status
也叫 staging area,表示下一次 commit 会包含什么。
git add <file>
git diff --cached
本地 commit 历史。
git log --oneline
远端仓库,比如 GitHub 上的 origin。
git fetch
git pull --rebase
git push
Git 大多数命令都在移动这几个区域之间的内容。
先判断文件现在在哪个区域,再选择命令,误操作会少很多。
| 命令 | 主要影响 |
|---|---|
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 restore 或 git stashgit restore --stagedreset 或 commit --amendrevert先判断区域,再选择命令,是 Git 排错的第一原则。