Appearance
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
HEAD 是一个特殊指针,指向当前所在分支的最新提交。它代表你的"上一次提交"状态。
bash
# 查看 HEAD 指向
cat .git/HEAD
# ref: refs/heads/main
# 查看 HEAD 对应的提交
git log HEAD -1Index(暂存区)
Index 是你准备好的"下次提交快照"。你运行 git add 时,就是在更新 Index。
bash
# 查看 Index 中的内容
git ls-files --stageWorking 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 所有命令的基础。后续所有操作都可以用"数据在哪个区域、向哪里移动"来理解。