很多新手用 Git 只背命令不记原理,遇到"提交了没有""怎么撤销不丢代码"就发懵。其实 Git 的一切操作都围绕三个区域展开:工作区、暂存区、版本库。搞懂它们,所有命令都会变得顺理成章。

1. 三个区域分别是什么

可以把暂存区理解为"购物车":工作区是货架,版本库是仓库,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. 常见误区与排查

💡 学习建议:打开一个测试仓库,依次执行 add、commit、reset,配合 git status 观察文件在每个阶段的状态变化,亲手验证一遍比读十篇文章都管用。