Git 工作区、暂存区和版本库

Git 的三个核心区域:工作区(Working Directory)暂存区(Staging Area / Index)版本库(Repository) 是理解 Git 工作流程的基础。下面用最清晰的方式帮你理清楚它们的概念、作用和关系。

1. 工作区(Working Directory)

  • 就是你电脑上能看到的项目文件夹,也就是你编辑文件的地方。
  • 所有你用编辑器打开、修改、增删的文件,都发生在工作区。
  • 状态:文件可能是 已修改(modified)新建但未 git add已删除 等。
  • 简单说:你敲代码的地方就是工作区。

2. 暂存区(Staging Area / Index)

  • 一个中间层,位于 .git 目录下的 index 文件(实际上是一个二进制文件)。
  • 作用:让你选择"下次要提交哪些改动"。
  • 通过 git add <文件> 把工作区的改动放入暂存区。
  • 暂存区可以理解为"提交的预览区"或"购物车":
    • 你可以只 add 部分文件
    • 可以 add 多次,暂存区会不断更新
    • 可以 git reset HEAD <文件> 把暂存区的东西拿出来(不影响工作区)
  • 状态查询:git status 中显示的 "Changes to be committed" 就是暂存区的内容。

3. 版本库(Repository)

  • 位于项目根目录下的 .git 文件夹(隐藏)。
  • 存放所有提交(commit)的历史记录、分支、标签等。
  • 每次执行 git commit 时:
    • Git 会把当前暂存区的内容打包成一个 commit 对象
    • 存入版本库(.git/objects)
    • 更新当前分支指针(通常是 HEAD → master/main)
  • 状态查询:git log 看到的提交历史就是版本库里的内容。

三者关系图(经典图解)

复制代码
工作区 (Working Directory)
    ↑↓ git add
暂存区 (Staging Area / Index)
    ↑↓ git commit
版本库 (Repository,包含 .git 目录)

实际操作流程示例

bash 复制代码
# 1. 修改了 a.txt 和 b.txt
git status
# → 显示 a.txt modified, b.txt modified(都在工作区)

# 2. 只想提交 a.txt 的改动
git add a.txt
git status
# → a.txt 在 "Changes to be committed"(暂存区)
# → b.txt 还在 "Changes not staged for commit"(工作区)

# 3. 提交
git commit -m "只修改了 a.txt"
# → 暂存区内容被提交到版本库,暂存区被清空

# 4. 再把 b.txt 加进来提交
git add b.txt
git commit -m "修改 b.txt"

常用命令与三个区域的关系总结

命令 影响的区域 说明
git add 工作区 → 暂存区 把改动放入暂存区
git commit 暂存区 → 版本库 把暂存区内容生成新 commit
git checkout -- 版本库 → 工作区 用版本库的版本覆盖工作区(丢弃工作区改动)
git reset HEAD 暂存区 → 工作区 取消暂存(暂存区改动退回到工作区)
git reset --hard 版本库 → 工作区 + 暂存区 强制重置到某个 commit,所有改动丢失
git restore 版本库 → 工作区(新命令) 丢弃工作区改动
git restore --staged 暂存区 → 工作区(新命令) 取消暂存

一句话总结区别

掌握了这三个区域,你就真正理解了 Git 的核心工作机制,后续学习 rebase、cherry-pick、stash 等高级操作也会轻松很多。

相关推荐
DBA小马哥6 小时前
时序数据库迁移替换与时序数据库分片
数据库·时序数据库
DBA小马哥6 小时前
时序数据库迁移方案在物联网设备监测中的实践与性能突破
数据库·物联网·时序数据库
ID_180079054736 小时前
小红书笔记详情API接口基础解析:数据结构与调用方式
数据结构·数据库·笔记
ruleslol12 小时前
MySQL的段、区、页、行 详解
数据库·mysql
while(1){yan}12 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
それども12 小时前
MySQL affectedRows 计算逻辑
数据库·mysql
是小章啊12 小时前
MySQL 之SQL 执行规则及索引详解
数据库·sql·mysql
富士康质检员张全蛋12 小时前
JDBC 连接池
数据库
yangminlei13 小时前
集成Camunda到Spring Boot项目
数据库·oracle
小龙14 小时前
【Git 报错解决】本地无有效提交无法推送(`src refspec main does not match any`)
git·github·报错