文章目录
- [Git 三个主要区域详解:Working Directory、Staging Area、Repository](#Git 三个主要区域详解:Working Directory、Staging Area、Repository)
- [一、Git 的三个主要区域](#一、Git 的三个主要区域)
- [二、Working Directory(工作区)](#二、Working Directory(工作区))
- [三、Staging Area(暂存区)](#三、Staging Area(暂存区))
- 四、Repository(仓库区)
-
- 什么是仓库区
- [git commit 的本质](#git commit 的本质)
- [commit 后会发生什么](#commit 后会发生什么)
- 五、三区流转完整流程
-
- [1. 修改文件](#1. 修改文件)
- [2. 添加到暂存区](#2. 添加到暂存区)
- [3. 提交到仓库](#3. 提交到仓库)
- 六、三区结构图(非常重要)
- 七、常见命令对三区的影响
- 八、一个经典误区
- [九、为什么 Git 设计成三区](#九、为什么 Git 设计成三区)
- [十、理解三区后,你会真正理解 Git](#十、理解三区后,你会真正理解 Git)
- 十一、总结
Git 三个主要区域详解:Working Directory、Staging Area、Repository
Git 之所以强大,很大程度上来源于它清晰的"三区模型"。
很多刚接触 Git 的开发者,经常会疑惑:
- 为什么
git add之后还要git commit - 为什么文件修改后状态会变化
- 为什么有时候代码"已经保存了"但却"没有提交"
本质原因,就是没有真正理解 Git 的三个主要区域。
本文将系统介绍:
- Git 三个区域分别是什么
- 它们之间如何流转
- 常见命令如何影响区域
- 为什么 Git 要这样设计
一、Git 的三个主要区域
Git 工作流中,最核心的三个区域:
text
Working Directory
↓ git add
Staging Area
↓ git commit
Repository
分别是:
| 区域 | 中文 | 作用 |
|---|---|---|
| Working Directory | 工作区 | 你正在修改的文件 |
| Staging Area | 暂存区 | 准备提交的内容 |
| Repository | 仓库区 | Git 已保存的历史版本 |
可以把它理解成:
text
你正在写代码
↓
你挑选准备提交的代码
↓
Git永久保存版本
二、Working Directory(工作区)
什么是工作区
工作区就是:
你当前电脑里真实可见的项目目录
例如:
text
my-project/
├── app.py
├── README.md
└── requirements.txt
你在 IDE 中修改文件:
python
print("hello")
这些修改都发生在:
text
Working Directory
工作区特点
工作区中的内容:
- 可以随意修改
- 可以删除
- 可以新增
- Git 尚未正式记录
此时 Git 只是知道:
text
"你改了东西"
但还没有进入版本历史。
查看工作区状态
使用:
bash
git status
例如:
bash
modified: app.py
说明:
text
工作区发生了修改
三、Staging Area(暂存区)
什么是暂存区
暂存区(Stage / Index)是:
一个"提交候选区"
它的作用:
text
决定哪些修改会进入下一次 commit
为什么需要暂存区
这是 Git 非常优秀的设计。
假设你修改了:
text
app.py
README.md
test.py
但你只想提交:
text
app.py
这时:
bash
git add app.py
只有 app.py 会进入暂存区。
其他文件不会被提交。
git add 的本质
很多人误以为:
bash
git add = 提交
其实不是。
真正含义是:
text
把工作区修改放入暂存区
流程:
text
Working Directory
↓ git add
Staging Area
查看暂存区状态
bash
git status
示例:
bash
Changes to be committed:
modified: app.py
说明:
text
app.py 已进入暂存区
暂存区的价值
暂存区允许你:
1. 分批提交
例如:
第一次提交:
bash
git add login.py
git commit -m "feat: add login"
第二次提交:
bash
git add payment.py
git commit -m "feat: add payment"
即使两个文件同时修改,也能拆分历史。
2. 保持 commit 干净
好的 commit 应该:
text
一个 commit 只做一件事
暂存区让你可以精确控制。
3. 做代码 review 更容易
review 时:
text
每个 commit 都是独立逻辑
而不是:
text
"这一大堆改动到底干了啥"
四、Repository(仓库区)
什么是仓库区
仓库区:
text
.git 目录中的版本数据库
这里保存:
- commit 历史
- branch
- tag(给特定的commit打标签)
- Git 对象
- 版本快照
git commit 的本质
执行:
bash
git commit -m "feat: add login"
本质:
text
把暂存区内容保存到 Repository
流程:
text
Working Directory
↓ git add
Staging Area
↓ git commit
Repository
commit 后会发生什么
Git 会:
- 生成 commit SHA
- 保存文件快照
- 建立历史链
- 更新当前 branch
例如:
bash
a1b2c3d feat: add login
此时:
text
代码正式进入版本历史
五、三区流转完整流程
1. 修改文件
bash
vim app.py
进入:
text
Working Directory
2. 添加到暂存区
bash
git add app.py
进入:
text
Staging Area
3. 提交到仓库
bash
git commit -m "update app"
进入:
text
Repository
六、三区结构图(非常重要)
text
┌────────────────────┐
│ Working Directory │
│ (工作区) │
└─────────┬──────────┘
│ git add
▼
┌────────────────────┐
│ Staging Area │
│ (暂存区) │
└─────────┬──────────┘
│ git commit
▼
┌────────────────────┐
│ Repository │
│ (仓库区) │
└────────────────────┘
七、常见命令对三区的影响
| 命令 | 作用 |
|---|---|
| git add | 工作区 → 暂存区 |
| git commit | 暂存区 → 仓库区 |
| git restore | 恢复工作区 |
| git restore --staged | 从暂存区撤回 |
| git reset | 回退 commit / 暂存区 |
| git checkout | 切换版本影响工作区 |
| git diff | 查看工作区差异 |
| git diff --staged | 查看暂存区差异 |
八、一个经典误区
很多新手:
bash
git add .
之后认为:
text
"已经提交了"
实际上只是:
text
进入暂存区
真正进入 Git 历史的是:
bash
git commit
九、为什么 Git 设计成三区
Git 之所以强于很多旧版 VCS:
就在于:
text
它允许"提交前精确控制"
例如:
- 只提交部分文件
- 拆分 commit
- 组织历史
- 清晰 review
- 管理大型修改
这都是暂存区带来的能力。
十、理解三区后,你会真正理解 Git
很多 Git 命令本质上都在:
text
不同区域之间移动数据
例如:
| 命令 | 本质 |
|---|---|
| git add | 工作区 → 暂存区 |
| git commit | 暂存区 → 仓库 |
| git reset | 仓库 → 暂存区 |
| git restore | 暂存区 → 工作区 |
| git checkout | 仓库 → 工作区 |
理解这一点:
Git 会突然变得非常清晰。
十一、总结
Git 三个主要区域:
| 区域 | 作用 |
|---|---|
| Working Directory | 正在修改的文件 |
| Staging Area | 准备提交的内容 |
| Repository | 已保存历史版本 |
核心流转:
text
工作区
↓ git add
暂存区
↓ git commit
仓库区
真正掌握 Git 的关键:
不是死记命令。
而是:
text
理解数据在三区之间如何流动
当你理解这一点后:
- reset
- checkout
- restore
- rebase
- cherry-pick
这些命令都会变得容易理解。