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(可多个,如合并提交)。
  • 分支只是指向图中节点的可移动标签。
  • 操作如 rebasecherry-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 命令都只是这套逻辑的具体应用。

此文件夹下有3条笔记。