Skip to content

Git 核心概念

理解 Git 的核心概念是高效使用 Git 的关键。Git 有四个主要区域,掌握它们之间的关系和数据流动,才能真正理解 Git 的工作方式。

工作区(Working Directory)

工作区(也称工作目录、工作树)是你在本地磁盘上实际看到和编辑的文件目录。

project/
├── .git/          # Git 仓库目录(隐藏)
├── src/
│   ├── main.js
│   └── utils.js
├── README.md
└── package.json

除了 .git/ 目录之外的所有内容,都属于工作区。你在编辑器中打开的文件、修改的代码,都发生在工作区。

特点:

  • 文件可见,可以直接编辑
  • 对文件的修改不会自动记录到 Git
  • 可以有未跟踪的新文件
  • 可以有已跟踪文件的未暂存修改

暂存区(Staging Area / Index)

暂存区(也叫索引 Index 或缓存区 Cache)是一个准备下次提交的文件列表,位于 .git/index 文件中。

暂存区是 Git 区别于其他版本控制系统的重要特性之一。它让你可以精确控制哪些改动进入下一次提交。

bash
# 将文件从工作区添加到暂存区
git add src/main.js

# 查看暂存区状态
git status
# Changes to be committed:
#   modified: src/main.js

暂存区的价值:

  • 可以只提交部分文件的修改,而非全部改动
  • 可以将一次大改动拆分成多个逻辑清晰的小提交
  • 提交前可以再次检查和调整

**类比:**想象你要打包快递:

  • 工作区 = 你的工作台,上面摆着各种东西
  • 暂存区 = 快递箱,你把要寄的东西放进去
  • 提交 = 封箱发货,这些东西就永久记录了

本地仓库(Local Repository)

本地仓库是存储在 .git/ 目录中的完整版本数据库。它包含了项目的完整历史记录,所有提交、分支、标签等信息都在这里。

bash
# 提交暂存区的内容到本地仓库
git commit -m "feat: 添加用户登录功能"

# 查看本地仓库历史
git log --oneline
# a1b2c3d feat: 添加用户登录功能
# e4f5g6h fix: 修复首页样式问题
# ...

特点:

  • 完整的项目历史,可离线访问
  • 每次提交都有唯一的 SHA-1 哈希标识
  • 提交后的数据几乎不会丢失(有 reflog 保护)

远程仓库(Remote Repository)

远程仓库是托管在网络服务器上的 Git 仓库,用于团队协作和代码备份。常见的远程仓库服务有:

  • GitHub:全球最大的开源代码托管平台
  • GitLab:功能完整,支持私有部署
  • Gitee(码云):国内主流平台
  • Bitbucket:与 Atlassian 工具深度集成
bash
# 添加远程仓库
git remote add origin https://github.com/user/repo.git

# 推送到远程仓库
git push origin main

# 从远程仓库拉取
git pull origin main

常见操作:

操作方向命令
fetch远程 → 本地(不合并)git fetch
pull远程 → 本地(自动合并)git pull
push本地 → 远程git push

三棵树模型:HEAD、Index、Working Directory

Git 内部维护着三个"树"(文件集合),理解这三棵树是理解 reset、checkout 等命令的关键。

┌─────────────────────────────────────────────────┐
│                 三棵树模型                        │
│                                                   │
│  HEAD          Index(暂存区)    Working Directory│
│  ┌──────┐      ┌──────────┐      ┌─────────────┐ │
│  │commit│      │file v2   │      │file v3      │ │
│  │      │      │other v1  │      │other v1     │ │
│  │file  │      │          │      │new-file     │ │
│  │v1    │      │          │      │             │ │
│  └──────┘      └──────────┘      └─────────────┘ │
│                                                   │
│  git add ──────────────→                         │
│  git commit ←──────────                          │
│  git reset HEAD ←──────→                         │
└─────────────────────────────────────────────────┘

HEAD 是一个特殊指针,指向当前所在分支的最新提交。它代表你的"上一次提交"状态。

bash
# 查看 HEAD 指向
cat .git/HEAD
# ref: refs/heads/main

# 查看 HEAD 对应的提交
git log HEAD -1

Index(暂存区)

Index 是你准备好的"下次提交快照"。你运行 git add 时,就是在更新 Index。

bash
# 查看 Index 中的内容
git ls-files --stage

Working Directory

Working Directory 是实际的文件系统,是你直接编辑的地方。它是 Index 内容的"沙盒",可以自由修改而不影响 Index 和 HEAD。

数据流动

工作区 ──git add──→ 暂存区 ──git commit──→ HEAD(本地仓库)

HEAD ──git checkout──→ 工作区
HEAD ──git reset──→ 暂存区
暂存区 ──git checkout──→ 工作区

完整工作流示意

远程仓库
   ↕ push/pull/fetch
本地仓库(HEAD)
   ↑ commit
暂存区(Index)
   ↑ add
工作区(Working Directory)
   ↑ 编辑文件

总结

区域位置特点
工作区本地文件系统实际可编辑的文件
暂存区.git/index下次提交的准备区
本地仓库.git/objects/完整的历史记录
远程仓库网络服务器协作与备份

理解这四个区域以及它们之间的数据流动,是掌握 Git 所有命令的基础。后续所有操作都可以用"数据在哪个区域、向哪里移动"来理解。