Git三个主要区域介绍(工作区Working Directory、暂存区Index/Staging Area、仓库区Repository)

文章目录

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

这些命令都会变得容易理解。

相关推荐
深海鱼在掘金6 小时前
Git 完全指南 —— 第1章:Git 概览与版本控制演进
git
noravinsc1 天前
关于Git Flow
git
蜜獾云1 天前
在Git中配置用户名和密码
git
scx_link1 天前
通过git bash在本地创建分支,并推送到远程仓库中
开发语言·git·bash
南大白1 天前
IntelliJ IDEA 运行时的 JVM 本地内存溢出崩溃
git
码农小旋风1 天前
Claude Code 基础用法大全:对话、分析、修改、测试、Git 和工作流
人工智能·git·chatgpt·claude
南大白1 天前
Git 撤回提交完整方案
git
像风一样的男人@1 天前
python --实现代理服务器
git·ui
sbjdhjd1 天前
从零搭建企业级 CI/CD(下):Jenkins+GitLab+Harbor 全链路实战指南
git·servlet·ci/cd·云原生·云计算·gitlab·jenkins
码云数智-大飞1 天前
Go Channel 详解:并发通信的正确姿势
前端·数据库·git