跳到内容

元数据卡: 前置知识:ch03-git-workflow.md(或任一章理解后) | 预计时间:15 分钟 | 完成标志:完成三个热身练习 + 一个排障场景

热身(5 分钟,必做)

这组练习建立从零开始的完整 Git 项目——在你电脑上走一遍。

bash
# 练习 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 记录。

bash
# 练习 2:修改文件并再次提交
echo "I'm learning Git" >> hello.txt
git add .
git commit -m "追加一行学习记录"
git log --oneline

预期: 看到两行 commit 记录。

bash
# 练习 3:查看两次提交之间的差异
git diff HEAD~1 HEAD

预期: 显示从第一个 commit 到第二个 commit 之间新增了一行 I'm learning Git

试试看: 修改 hello.txt,再 commit 一次,然后用 git diff HEAD~2 HEAD 对比从"两小时前"到现在的结果。


挑战(20 分钟,选做)

如果热身太简单,这个挑战会逼你解决一个真实的冲突。

bash
# 步骤 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 的第一行。

bash
# 步骤 3:尝试合并
git merge test-branch

你会看到 CONFLICT。打开文件,删掉 <<<<<<<=======>>>>>>>,保留你想要的内容,然后:

bash
git add hello.txt
git commit -m "解决冲突:保留主干版本"

步骤 4: 查看最终的分支图:

bash
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——暂存工作:

bash
git stash          # 暂存当前工作
git pull           # 拉取远程代码
git stash pop      # 恢复暂存的工作(可能还有冲突要解决)

方案 B——先 commit 自己的修改:

bash
git add .
git commit -m "暂存我的修改"
git pull           # 再拉取远程,解决冲突

场景 3:commit 后发现忘了加文件

如果你还没 push:

bash
git add 忘掉的文件.py
git commit --amend --no-edit

--no-edit 表示不修改 commit message。

如果你已经 push 了:git commit --amend 然后 git push --force注意:只在 solo 分支上做这个操作。

场景 4:回滚到某个历史版本

bash
# 在不破坏历史的情况下"回退"——这不是删除历史,而是创建一个反向 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 怎么办?你盯着屏幕上闪动的光标,看着代码一行行滚过——"有没有一种工具,能让代码在运行的过程中停下来,让我看看它里面到底在发生什么?"

有。下一章,你的显微镜

继续:第4章——调试与诊断

Built with VitePress | Software Systems Atlas