适用人群: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 各适合什么场合(口头说清即可)