适用人群:Git 零基础起步,以日常笔记仓库为练习场。 主线:先记住「三区模型」,命令自然就懂了。
1. 核心要点:先建立「三区」心智模型
核心要点:90% 的 Git 疑惑都源于不知道「文件现在在哪个区」。Git 有三个区域——工作区 → 暂存区 → 本地仓库,再加一个远程仓库。所有常用命令本质上就是在这些区之间搬东西。
工作区 暂存区 本地仓库 远程仓库
(你编辑的文件) (git add 后) (git commit 后) (GitHub 等)
│ git add │ git commit │ git push │
├──────────────▶├─────────────────▶ ├───────────────────▶ │
│◀──────────────┤◀───────────────── ├── ◀─────────────────┤
│ git restore │ │ git fetch / pull │
| 区 | 是什么 | 对应命令 |
|---|---|---|
| 工作区 | 你正在编辑的目录 | git status 里红色的文件 |
| 暂存区 | 下次 commit 要打包的内容 | git add 之后变绿色的文件 |
| 本地仓库 | 已提交的历史(.git/ 目录) | git log 能看到的 |
| 远程仓库 | 别人/其他机器上的副本 | git push / git pull 打交道 |
2. 常用命令速查表(按场景)
2.1 首次配置与建仓
| 命令 | 作用 | 备注 |
|---|---|---|
git config --global user.name "xxx" | 设置全局用户名 | 提交记录会显示它 |
git config --global user.email "xxx@xx.com" | 设置全局邮箱 | GitHub 用它关联头像/贡献图 |
git init | 当前目录变成 Git 仓库 | 生成隐藏的 .git/ |
git clone <url> | 克隆远程仓库到本地 | 自带远程连接 |
2.2 日常四件套(用得最多)
| 命令 | 作用 |
|---|---|
git status | 看当前状态:哪些改了、哪些暂存了(最常打) |
git add <file> / git add . | 把文件放入暂存区;. 表示全部 |
git commit -m "说明" | 把暂存区内容打包成一次提交 |
git log --oneline | 一行一条看提交历史 |
2.3 查看差异与历史
| 命令 | 作用 |
|---|---|
git diff | 工作区 vs 暂存区的改动 |
git diff --staged | 暂存区 vs 上次提交的改动 |
git show <commit> | 看某次提交的具体内容 |
git blame <file> | 看文件每行是谁、哪次提交写的 |
2.4 撤销与回退(救火)
| 命令 | 作用 | 危险度 |
|---|---|---|
git restore <file> | 丢弃工作区改动(未 add) | ⚠️ 改动不可恢复 |
git restore --staged <file> | 取消暂存(add 反悔),保留改动 | 安全 |
git reset --soft HEAD~1 | 撤销上次 commit,保留改动在暂存区 | 安全,改说明重提最常用 |
git revert <commit> | 生成一个「反向提交」抵消指定提交 | ✅ 最安全,适合已 push 的场景 |
2.5 分支
| 命令 | 作用 |
|---|---|
git branch | 列出本地分支,* 标记当前分支 |
git branch <名字> | 新建分支(不切换) |
git switch <名字> | 切换分支 |
git switch -c <名字> | 新建并切换(= -b) |
git merge <分支> | 把指定分支合并进当前分支 |
git branch -d <名字> | 删除已合并的分支 |
2.6 远程协作
| 命令 | 作用 |
|---|---|
git remote -v | 看远程仓库名和地址 |
git remote add origin <url> | 关联一个远程仓库 |
git push -u origin main | 首次推送并建立跟踪关系 |
git push | 推送(之后简写即可) |
git fetch | 只下载远程更新,不合并(先看看再说) |
git pull | 下载并合并 = fetch + merge |
3. 高频组合拳
# 场景1:日常保存进度(写笔记的标准流程)
git status # 先看有什么变动
git add path/to/note.md # 只加想提交的文件
git commit -m "feat(模块): 添加 xx 笔记"
git push
# 场景2:commit 说明写错了,想重写
git reset --soft HEAD~1 # 退回但保留改动
git commit -m "正确的说明"
# 场景3:某个文件改坏了,恢复到最后一次提交的状态
git restore 文件名
# 场景4:push 被拒(远程有新提交)
git pull # 先拉下来合并
git push # 再推
# 场景5:实验性改动,开个分支玩
git switch -c try-something
# ...随便折腾...
git switch main # main 完全不受影响
4. 常见坑与误区
⚠️ 坑 1:把不该提交的文件 add 进去了(如编辑器/助手的本地配置、进度笔记等本地配置层) → 现象:
git status里出现不想推的文件。 → 原因:git add .会把所有文件一网打尽。 → 正确写法:精确指定文件名来 add;长期排除则写进.gitignore;已被跟踪的用git rm --cached 文件名取消跟踪(本地文件保留)。⚠️ 坑 2:
reset --hard之后改动全没了 → 现象:想撤销 commit 却把代码也丢了。 → 原因:--hard会连工作区一起重置。 → 正确写法:只是想重写 commit 说明用--soft;丢弃工作区改动前先用git stash(暂存起来)留后路。⚠️ 坑 3:已经 push 的提交,直接 reset 再强推 → 现象:远程历史被改,协作者(或另一台机器)一片混乱。 → 原因:reset 重写了历史。 → 正确写法:已推送的内容用
git revert,追加一个反向提交而不是篡改历史。⚠️ 坑 4:以为
pull总是安全的 → 现象:pull 后出现冲突标记<<<<<<<。 → 原因:本地和远程改了同一处。 → 正确写法:冲突不是错误——打开文件手动选择保留哪边,删掉标记,再add+commit;拿不准时先fetch看 diff。⚠️ 坑 5:commit message 随手写「update」「fix」 → 现象:一个月后翻历史完全看不出每次改了啥。 → 正确写法:遵循约定格式,如
feat(模块): 添加 xx 笔记。
5. 顿悟
- commit 不是「保存」,而是「打包快照」:暂存区就是你的「打包清单」,
add往清单上加东西,commit按清单拍照。想明白这点,status输出里红/绿的含义、restore --staged为什么安全,全部不言自明。 - 本地操作随便反悔,涉及远程要谨慎:
add、commit、branch、reset都只动本地仓库,怎么折腾都能救回来;一旦push出去,就要优先选revert这种不改历史的做法。 - Git 的一切都是「指针 + 快照」:分支只是一个指向某次提交的可移动标签,切换分支 = 移动这个标签指向。理解了这一点,后面学 rebase、HEAD、detached HEAD 都不会怕。
6. 验收清单
- 不看笔记,画出三区模型的示意图并标出 add / commit / push 的方向
- 在自己的仓库做一次完整流程:
status → add → diff --staged → commit → push - 故意写错 commit 说明,用
reset --soft HEAD~1重写一次 - 新建分支
try-git、切过去改个文件再切回main,确认 main 上没有该改动 - 解释
reset --soft和revert各适合什么场合(口头说清即可)
豫公网安备41108202000982号