1. Git 的四个逻辑区域
Git 在本地管理版本数据时,实际流转于四个区域:
| 区域 | 英文 | 存放内容 | 对应位置 |
|---|---|---|---|
| 工作区 | Working Directory | 你直接编辑、增删的文件 | 项目文件夹中的可见文件 |
| 暂存区 | Staging Area / Index | 规划中的下一次提交内容 | .git/index(二进制) |
| 本地仓库 | Local Repository | 完整的提交历史、分支、标签、对象库 | .git/ 整个目录 |
| 远程仓库 | Remote Repository | 托管于服务器上的仓库副本 | GitHub / GitLab / 自建服务器等 |
1.1 四区数据流向
工作区 ── git add ──▶ 暂存区 ── git commit ──▶ 本地仓库 ── git push ──▶ 远程仓库
◀─────────── git checkout / restore / pull / fetch ──────────────| 操作 | 方向 | 含义 |
|---|---|---|
git add | 工作区 → 暂存区 | 挑选文件修改,预备下一次提交 |
git commit | 暂存区 → 本地仓库 | 创建提交对象,固化快照 |
git push | 本地仓库 → 远程仓库 | 将本地提交同步至远端 |
git fetch | 远程仓库 → 本地仓库 | 下载远端对象和引用(不改变工作区) |
git pull | 远程仓库 → 本地仓库 + 工作区 | fetch + merge,更新本地分支并合并 |
git checkout / git switch | 本地仓库 → 工作区 | 将指定版本的内容恢复到工作区 |
2. Git 核心概念补充
2.1 对象模型
Git 底层是内容寻址的键值数据库,包含四类不可变对象:
| 对象 | 存储内容 | 命名方式 |
|---|---|---|
| blob | 文件内容(不含文件名) | SHA-1(内容哈希) |
| tree | 目录结构(权限、文件名 → blob/tree 哈希) | SHA-1 |
| commit | 指向一个 tree(项目根快照),作者、时间、消息、父 commit 引用 | SHA-1 |
| tag | 指向另一个对象(通常是 commit),标签信息、签名 | SHA-1 |
一个 commit 即代表那一刻的整个项目快照,加上历史关联。
2.2 引用
引用是指向对象的可变指针,本质是 40 位 SHA-1 字符串保存在 .git/refs/ 下。
| 引用 | 含义 |
|---|---|
| 分支(Branch) | 指向某个 commit 的可移动指针(如 refs/heads/main) |
| 标签(Tag) | 固定指向某个 commit 的指针,常用于标记发布版本 |
| HEAD | 当前检出的分支或提交指针,决定工作区状态 |
| 远程跟踪分支 | 如 origin/main,记录上次 fetch 时远程分支的位置 |
2.3 核心操作概念
| 概念 | 说明 |
|---|---|
| 提交(Commit) | 项目在某一时刻的完整快照,通过 DAG 串联成历史 |
| 索引(Index) | 即暂存区,是准备构建下一个 commit 的 tree 对象 |
| 合并(Merge) | 将两个分支的修改整合,可能产生冲突 |
| 变基(Rebase) | 将一段提交历史“移植”到另一个提交的基础之上,重写哈希,得到线性历史 |
| 冲突(Conflict) | 两个分支对同一文件同一区域做了不同修改,Git 无法自动合并时产生,需手工解决 |
| 快进合并(Fast-forward) | 当目标分支可直接前进时,直接移动指针,不产生合并提交 |
| 分离头状态(Detached HEAD) | HEAD 直接指向某个 commit 而非分支,此时提交可能丢失 |
2.4 历史图模型
Git 的提交历史是一个有向无环图(DAG):
- 每个 commit 指向其父 commit(可多个,如合并提交)。
- 分支只是指向图中节点的可移动标签。
- 操作如
rebase、cherry-pick本质是对图节点的重新挂接或复制。
3. 日常操作对应区域
| 你做的事 | 涉及区域 |
|---|---|
| 编辑代码 | 工作区 |
git add | 挑选到暂存区 |
git commit | 暂存区 → 本地仓库(产生新 commit) |
git push | 本地仓库 → 远程仓库 |
git pull | 远程仓库 → 本地仓库 → 工作区(若干净) |
git reset --soft HEAD~1 | 撤销提交,保留暂存区和工作区修改 |
git reset --hard | 将工作区和暂存区强制对齐到指定 commit |
git stash | 临时保存工作区和暂存区修改,恢复干净工作区 |
4. 总结
Git 的本质是:一个内容寻址的对象数据库 + 一套操作指针的图工具 + 四个数据流转区域。
所有操作均可归结为创建对象、移动引用、在不同区域间搬运数据。掌握四区流向与核心对象模型后,任何 Git 命令都只是这套逻辑的具体应用。