元数据卡: 前置知识:ch03-git-workflow.md(或任一章理解后) | 预计时间:15 分钟 | 完成标志:完成三个热身练习 + 一个排障场景
热身(5 分钟,必做)
这组练习建立从零开始的完整 Git 项目——在你电脑上走一遍。
# 练习 1:创建仓库并做第一次提交
cd ~/Desktop
mkdir git-warmup && cd git-warmup
git init
echo "Hello Git" > hello.txt
git add hello.txt
git commit -m "初始提交"
git log --oneline预期: 看到一行 commit 记录。
# 练习 2:修改文件并再次提交
echo "I'm learning Git" >> hello.txt
git add .
git commit -m "追加一行学习记录"
git log --oneline预期: 看到两行 commit 记录。
# 练习 3:查看两次提交之间的差异
git diff HEAD~1 HEAD预期: 显示从第一个 commit 到第二个 commit 之间新增了一行 I'm learning Git。
试试看: 修改 hello.txt,再 commit 一次,然后用 git diff HEAD~2 HEAD 对比从"两小时前"到现在的结果。
挑战(20 分钟,选做)
如果热身太简单,这个挑战会逼你解决一个真实的冲突。
# 步骤 1:创建分支冲突场景
git switch -c test-branch
echo "在分支上的修改" > hello.txt
git add hello.txt && git commit -m "分支修改"
# 步骤 2:切换回 master,同一文件不同内容
git switch master
echo "在主干的修改" > hello.txt
git add hello.txt && git commit -m "主干修改"现在尝试合并——会出现冲突吗?是的,因为两个分支都改了 hello.txt 的第一行。
# 步骤 3:尝试合并
git merge test-branch你会看到 CONFLICT。打开文件,删掉 <<<<<<<、=======、>>>>>>>,保留你想要的内容,然后:
git add hello.txt
git commit -m "解决冲突:保留主干版本"步骤 4: 查看最终的分支图:
git log --graph --oneline --all试试看: 故意在解决冲突后运行 git merge --abort(还没 commit 之前),看看会怎样。
排障场景
场景 1:push 被拒绝
! [rejected] master -> master (fetch first)
error: failed to push some refs诊断: 远程有本地没有的提交。 解决: git pull → 如果有冲突就解决 → git push。
场景 2:pull 时报本地修改会被覆盖
error: Your local changes to the following files would be overwritten by merge诊断: 你有未 commit 的本地修改,和远程的修改冲突。 解决(两种方案):
方案 A——暂存工作:
git stash # 暂存当前工作
git pull # 拉取远程代码
git stash pop # 恢复暂存的工作(可能还有冲突要解决)方案 B——先 commit 自己的修改:
git add .
git commit -m "暂存我的修改"
git pull # 再拉取远程,解决冲突场景 3:commit 后发现忘了加文件
如果你还没 push:
git add 忘掉的文件.py
git commit --amend --no-edit--no-edit 表示不修改 commit message。
如果你已经 push 了:git commit --amend 然后 git push --force。注意:只在 solo 分支上做这个操作。
场景 4:回滚到某个历史版本
# 在不破坏历史的情况下"回退"——这不是删除历史,而是创建一个反向 commit
git revert HEAD~1这会创建一个新的 commit,其内容恰好是之前某个 commit 的反向操作。安全——不会重写历史。
速查表
| 场景 | 命令 |
|---|---|
| 查看当前状态 | git status |
| 查看提交历史(简洁) | git log --oneline --graph |
| 暂存改动 | git add <file> |
| 撤销暂存 | git restore --staged <file> |
| 撤销工作区改动 | git restore <file> |
| 创建并切换分支 | git switch -c <branch> |
| 查看所有分支 | git branch -a |
| 合并另一个分支 | git merge <branch> |
| 放弃合并冲突 | git merge --abort |
| 暂时放下手头工作 | git stash |
| 恢复暂存的工作 | git stash pop |
验收标准
学完本章,你应该能:
- [ ] 解释 Git 三棵树模型(工作区 ↔ 暂存区 ↔ 仓库)
- [ ] 独立创建仓库、commit、push、pull
- [ ] 创建和切换分支
- [ ] 解决一个合并冲突
- [ ] 知道
git pull = git fetch + git merge - [ ] 知道什么时候不该用 rebase(已推送到共享远程的分支)
旅人笔记
Git 不是文件的备份系统——它是时间线的管理工具。分支让你探索多条路径,合并让你把成果收回来,冲突是 Git 诚实的表现——它知道自己不擅长替你做决定。
现在你已经掌握了 Git。 代码写出来了,用 Git 管理起来了。但万一代码有 bug 怎么办?你盯着屏幕上闪动的光标,看着代码一行行滚过——"有没有一种工具,能让代码在运行的过程中停下来,让我看看它里面到底在发生什么?"
有。下一章,你的显微镜。