三个核心区域
Git 管理本地文件时,将文件系统划分为三个区域,理解这三个区域是掌握 Git 所有操作的基础。
工作区(Working Directory) 就是你电脑上实际看到的项目目录。你在这里编写代码、创建文件、修改内容。工作区中的文件处于"未监控"或"已修改"状态——Git 知道它们的存在,但还没有将最新的变更纳入版本控制。
暂存区(Staging Area / Index) 是一个介于工作区和版本库之间的缓冲区域。它的作用是让你对即将提交的变更进行二次确认——你可以精确地选择哪些文件的哪些修改要放进下一次提交,而不是一股脑地把所有改动都提交进去。
版本库(Repository) 存储 Git 所有的版本历史。每当你执行 git commit,暂存区中的内容就会被永久记录为一个快照(Snapshot),并分配一个唯一的 SHA-1 哈希值(如 a3f4b2c)。这个哈希值就是该版本的"身份证",后续可以随时通过它定位到这个版本。
快照机制
Git 的核心设计理念是快照而非差异。每次提交时,Git 会对当前暂存区中的所有文件拍一张"快照"——即完整保存每个文件的状态,并生成对应的哈希值。如果某个文件自上次提交以来没有变化,Git 不会重新存储文件内容,而是只保留一个指向之前版本的指针。
这就是为什么 Git 的版本切换如此快速——它不需要重新计算差异并逐个应用,只需要将工作区切换到对应快照的状态即可。
用一个具体例子说明。假设项目中有 index.js 和 style.css 两个文件:
第1次提交(快照 A):
index.js → 哈希 a1b2c3
style.css → 哈希 d4e5f6
第2次提交(快照 B,只改了 index.js):
index.js → 哈希 g7h8i9 (新内容,新的哈希)
style.css → 哈希 d4e5f6 (没变,直接指向上次的版本)
text
基本操作流程
从工作区到版本库的正向流程分为两步:
# 第一步:将工作区的变更添加到暂存区
git add <文件名> # 添加指定文件
git add . # 添加所有变更文件
# 第二步:将暂存区的内容提交到版本库
git commit -m "提交说明"
bash
这个两步设计看似多此一举,实际上是 Git 的一个重要特性。它允许你将不同的修改分成多次提交,保持每次提交的逻辑完整性。比如你同时修复了一个 bug 和添加了一个新功能,理想的做法是分成两次提交:
# 先提交 bug 修复
git add bug-fix.js
git commit -m "fix: 修复登录页面的空指针异常"
# 再提交新功能
git add new-feature.js
git commit -m "feat: 添加用户头像上传功能"
bash
而不是把所有改动塞进一次提交里,让日后的代码审查和历史追溯变得困难。
文件的监控状态
一个文件在 Git 中有以下几种状态:
| 状态 | 说明 | 所在区域 |
|---|---|---|
| Untracked | Git 不知道这个文件的存在 | 工作区 |
| Modified | 文件被修改,但还没有加入暂存区 | 工作区 |
| Staged | 文件的修改已加入暂存区,等待提交 | 暂存区 |
| Committed | 文件已提交到版本库 | 版本库 |
需要特别注意的是:一个文件只有在第一次被 git add 并 git commit 后,才会被 Git 开始追踪。如果只是创建了文件但从未 add 和 commit,Git 会将其标记为 Untracked,不会纳入版本控制。
查看当前文件状态的命令:
git status
bash
这个命令是 Git 中使用频率最高的命令之一,它会告诉你:哪些文件被修改了、哪些文件在暂存区、哪些文件还没被追踪。在执行任何 Git 操作前后都建议先看一下 git status,养成习惯能避免很多误操作。
常用命令速查
围绕三个区域的操作命令:
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看状态 | git status | 查看工作区和暂存区的文件状态 |
| 添加到暂存区 | git add <file> | 将指定文件的变更加入暂存区 |
| 添加所有变更 | git add . | 将所有变更加入暂存区 |
| 提交到版本库 | git commit -m "msg" | 将暂存区内容保存为新版本 |
| 查看提交历史 | git log | 查看版本库中的提交记录 |
| 查看差异 | git diff | 查看工作区和暂存区的差异 |
| 撤销暂存 | git restore --staged <file> | 将文件从暂存区退回工作区 |
| 丢弃修改 | git restore <file> | 将工作区文件恢复到暂存区状态 |
自测清单
如果以下问题你都能回答清楚,说明 Git 基础操作已经过关:
- 上班第一天,如何下载团队代码?(
git clone) - 修改代码后如何提交?(
git add+git commit+git push) - 如何获取同事最新的代码?(
git pull) - 线上代码出问题,如何回退到特定版本?(
git revert/git reset) - 如何合并同事已完成的代码和自己开发中的代码?(
git merge/git rebase) - 线上功能出问题,有没有清晰的工作流来修复?(hotfix 分支策略)
这些场景将在后续章节逐一展开讲解。
↑