很多新手用 Git 只背命令不记原理,遇到"提交了没有""怎么撤销不丢代码"就发懵。其实 Git 的一切操作都围绕三个区域展开:工作区、暂存区、版本库。搞懂它们,所有命令都会变得顺理成章。
1. 三个区域分别是什么
- 工作区(Working Directory):你正在编辑的目录,文件改动都发生在这里。
- 暂存区(Staging Area / Index):存放"准备提交"的快照,由
.git/index记录。 - 版本库(Repository):
.git中保存的提交历史,一旦 commit 就永久留痕。
可以把暂存区理解为"购物车":工作区是货架,版本库是仓库,git add 是把商品放进购物车,git commit 才是结账入库。
2. 文件如何在这三个区域间流动
一次最普通的提交流程,就是文件依次穿过三个区域的旅程:
echo "# Git Demo" > readme.md # 工作区:新建文件
git add readme.md # 暂存区:加入购物车
git commit -m "docs: 添加说明" # 版本库:正式入库
git log --oneline # 查看已提交的历史
注意 add 之后、commit 之前,改动只是被暂存,并未被 Git"记住";此时 git diff 默认看不到暂存内容,要看需加 --cached。
3. 用 git status 读懂当前状态
git status
# 输出中的三种文件状态:
# 1. Changes not staged → 改了但还没 add
# 2. Changes to be committed → 已 add 还没 commit
# 3. Untracked files → 从未被 Git 跟踪的新文件
# 想看清楚"改了什么"用 diff
git diff # 工作区 vs 暂存区
git diff --cached # 暂存区 vs 版本库
养成习惯:每次 commit 前先 git status,确认要提交的正是想要的,避免把调试代码提交上去。
4. 撤销与回退:三种 reset 的区别
git reset 可以"时光倒流",区别在于是否保留暂存区和工作区:
| 命令 | 暂存区 | 工作区 | 适用场景 |
|---|---|---|---|
| git reset --soft HEAD~1 | 保留 | 保留 | 撤销 commit 但保留改动,重新提交 |
| git reset --mixed HEAD~1 | 清空 | 保留 | 撤销 commit 和 add,改动回到工作区 |
| git reset --hard HEAD~1 | 清空 | 清空 | 彻底丢弃改动(慎用!) |
# 提交后发现漏了文件,想重来
git reset --soft HEAD~1 # 回到提交前,改动还在暂存区
git add missing.txt
git commit -m "完整提交"
# 只想撤销暂存,不丢改动
git reset HEAD file.txt # 等价于 git restore --staged file.txt
5. 常见误区与排查
- "我 commit 了为什么文件还是红的?"——多半是 commit 后又改了文件,新改动还在工作区。
- "git add . 之后 .gitignore 里的文件还是进来了?"——.gitignore 只对未跟踪文件生效,已跟踪的文件要先
git rm --cached。 - "reset --hard 后还能救回来吗?"——如果记得 commit 的哈希,用
git reflog找回,别慌着哭。
💡 学习建议:打开一个测试仓库,依次执行 add、commit、reset,配合 git status 观察文件在每个阶段的状态变化,亲手验证一遍比读十篇文章都管用。