Git 的三大工作区域:工作区、暂存区、本地仓库

Git 的核心设计之一,就是将代码变更的管理划分为三个清晰的区域:工作区(Working Directory)→ 暂存区(Staging Area)→ 本地仓库(Local Repository)


1. 工作区(Working Directory)

是什么?

你本地电脑上能直接看到、编辑的项目文件夹(包含所有源码、文档、子目录等)。这是你日常写代码、改配置、加注释的地方。

路径示例:/Users/you/project/ ------ 除了隐藏的 .git 文件夹外,其余都是工作区。

特点

  • 所有文件都处于 "当前开发状态" ,无论是否被 Git 跟踪。

  • 文件按 Git 视角分为两类状态:

    • 未跟踪(Untracked) :新创建的文件,Git 从未记录过(如刚新建的 readme.md)。

    • 已跟踪(Tracked)

      :曾被 git add 过,Git 有其历史记录。这类文件又可分为:

      • 未修改(Unmodified)
      • 已修改(Modified)
      • 已暂存(Staged)

注意:工作区的任何修改不会自动进入版本历史,必须通过 git add 显式告知 Git 哪些改动需要关注。

举例:

你的书桌------上面摊着草稿纸、涂改的段落、新写的章节......杂乱但充满创造力,尚未决定哪些内容要正式归档。


2.暂存区(Staging Area / Index)

是什么?

一个由 Git 内部维护的临时缓冲区 ,物理上存储在 .git/index 文件中(你看不到具体文件,但可通过命令操作)。 它是工作区与本地仓库之间的"中转站" ,用于预览和筛选即将提交的内容。

怎么进?

使用 git add <file>git add . 将工作区的修改(包括新增文件)加入暂存区。

特点

  • 只有通过 git add,修改才会进入暂存区。

  • 可以多次执行 git add,逐步构建一次提交的内容:

    csharp 复制代码
    git add feature.c      # 先暂存功能代码
    git add README.md      # 再暂存文档更新
  • 如果对已暂存的文件再次修改,新改动会留在工作区,不会自动进入暂存区,需重新 git add 才能包含。

这使得你可以把"修复 bug"和"添加新功能"拆成两次独立提交,哪怕它们是在同一个文件里完成的!

举例:

你的待寄包裹台------从书桌上挑选出几页满意的稿子,放进一个信封(暂存区),准备寄出。其他未选中的内容,仍留在桌上继续打磨。


3.本地仓库(Local Repository)

是什么?

位于项目根目录下的 .git 隐藏文件夹,其中存储了项目的完整历史快照,包括:

  • 所有提交(commits)
  • 分支(branches)
  • 标签(tags)
  • 配置信息等

.git 目录就是 Git 的"大脑",删除它就等于把项目变回普通文件夹(失去所有版本控制能力)。

怎么进?

执行 git commit -m "提交信息",将暂存区的全部内容一次性打包,生成一个新的提交(commit),永久保存到本地仓库。

特点

  • 每次 commit 会生成一个唯一的 SHA-1 哈希值(如 a3f2d1b...),作为该版本的身份证。
  • 提交后,工作区和暂存区会"清空"(相对于这次提交而言),你可以继续开发。
  • 即使你误删了工作区所有文件,只要本地仓库存在,就能通过 git checkoutgit restore 完整恢复!

举例:

你的个人档案馆------每次寄出的信

如图所示:

三大区域的数据流向

css 复制代码
[ 工作区 ] 
   │
   │ git add
   ▼
[ 暂存区 ] 
   │
   │ git commit
   ▼
[ 本地仓库 ]
   │
   │ git push
   ▼
[ 远程仓库 ] (如 GitHub / GitLab)
  • git add:从工作区 → 暂存区
  • git commit:从暂存区 → 本地仓库
  • git commit 不会提交工作区中未暂存的修改!
相关推荐
vibecoding日记2 天前
为什么我就想要「线性历史 + Signed Commits」,GitHub 却把我当猴耍 🤬🎙️
git·编程工具
程序员小崔日记3 天前
如何将代码轻松上传到 Gitee?Git 使用全攻略!
git·gitee·上传
Bigger3 天前
为什么你的 Git 提交需要签名?—— Git Commit Signing 完全指南
git·开源·github
DianSan_ERP4 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
红豆子不相思4 天前
Tomcat 环境搭建与集群实战
服务器·git·tomcat
杰哥技术分享4 天前
Git 仓库迁移技术文档:从 CODING.net 迁移至腾讯云 CNB
git
梅孔立4 天前
Ansible 100 台服务器一键管控实战 进阶版
服务器·git·ansible
qq_426003965 天前
git切换当前分支到远程分支
git
ON10N5 天前
100% 纯 Vibe Coding,我是怎么用 AI 撸出一个 VS Code 插件的
git·ai编程·visual studio code