← 迷你肉鸽 / 课程主页

工具手册 / 只讲你用得到的

Git 闯关指南

Git 是你的「存档系统」:写好一小块就提交一次,随时可以回到之前的版本,改动出错也能恢复。这一页只讲这门课真正会用到的几步,照着做即可。

🧠 三个词,看懂 Git

先建立整体印象,后面的命令就好理解了。

1. 仓库(repository / repo)

就是你这个项目的文件夹,外加它完整的历史。Git 会把每一次改动都记录下来,随时可以查看。

2. 存档(commit)

如同游戏里的存档点。写好一小块、测试通过,就提交一次。之后任何时候都可以回到某个提交,查看当时的状态。

3. 分支(branch)

一条平行的时间线。你在自己的分支上修改、提交,都不会影响别人的分支。每节课,都新建一条属于自己的分支来写。

还有两个「库」老师的库叫 upstream(原件,你只读、只从这里取新课);你 Fork 出来的那份叫 origin(你的复印件,你往这里提交和备份)。若记混,可用 git remote -v 查看。

🔧 第一次配置(整门课只做一次)

目的:把老师的库复印一份到你名下,再拉到自己电脑上。

  1. 在 GitHub 打开老师的库 xianyudd/first-frame,点右上角 Fork,复刻到你自己的账号。保持 Public,不要改成 Private。
  2. 在你复刻的 Actions 页启用工作流(只点这一次):打开 https://github.com/<你>/first-frame/actions,点绿色按钮 I understand my workflows, go ahead and enable them。GitHub 规定复刻出来的仓库默认不跑任何工作流 —— 不点这一步,后面 push 不会有任何反应,也不会报错。
  3. 把你自己的那份复刻 clone 到电脑(<你> 换成你的 GitHub 用户名):
git clone https://github.com/<你>/first-frame.git
cd first-frame
git remote add upstream https://github.com/xianyudd/first-frame.git   # 记住老师的库,用于取新课
git config commit.template .gitmessage                                # 提交时弹出中文提示模板
检查运行 git remote -v,应当同时看到 origin(你的)和 upstream(老师的)两个。再去你复刻的 Actions 页看一眼:如果还挂着「Workflows aren't being run…」的提示,说明第 2 步的绿色按钮还没点。两处都过了,才算配置完成。

🚀 每节课的开头(两条命令)

每开一门新课,先取回老师这节课的起点,再开一条属于自己的分支。下面以第 2 课为例。

git fetch upstream                                      # 从老师的库取回最新的课
git switch -c my-lesson-2 --no-track upstream/lesson-2   # 新建一条自己的分支,从第2课起点出发
  • fetch:只是把老师的更新「取下来」,暂时不会改动你正在写的代码。
  • switch -c my-lesson-2 …:新建一条叫 my-lesson-2 的分支并切换过去。-c = create(创建)。
  • --no-track:别把这条新分支「挂」到老师那条 upstream/lesson-2 上。不加它,git status 会显示「与 upstream/lesson-2 一致」,而且你忘了写 -u origin 时,git push 会报一大段看不懂的提示。加上它,忘了 -u 也会直接告诉你该敲哪条命令。
  • 换课就把数字换掉:第 3 课就是 my-lesson-3 和 upstream/lesson-3。
开分支前先把当前改动提交(commit,见下一节)。带着未提交的改动切换分支,容易造成混乱。

💾 写代码时的循环(最常用)

这是你重复最多次的动作。概括为:写一点 → 测试 → 提交一次。

make test                       # 先自查:这一小块是否正确
git add src/main.cpp            # 把改好的文件放进「待提交」
git commit                      # 提交:弹出中文模板,填写一句改动说明
  • add = 选出这次要提交的文件;commit = 正式保存这一次提交。
  • commit 后会打开编辑器和中文模板,照提示写一行「做了什么」,保存关闭即完成。
  • 每填完一个 ★TODO、测试通过,就提交一次。提交越勤,越不容易丢失进度。

写完一节课,想备份 / 上交

git push -u origin my-lesson-2   # 把你的分支上传到你自己的 GitHub 复刻

之后这条分支再有新提交,直接运行 git push 即可(不必再加 -u origin …)。

🔎 随时查看现状(只读,安全,可放心使用)

这些命令只查看、不修改,不会造成任何破坏。情况不明时,先运行它们。

git status              # 我改动了哪些文件?还有哪些未提交?
git branch              # 我当前在哪条分支?(前面有 * 的即是)
git log --oneline       # 查看已有的提交(每行一次提交)
git remote -v           # origin 和 upstream 分别指向何处
不确定状态时先 git status 再 git branch,弄清「当前在哪条分支、有无未提交的改动」,再决定下一步。

📏 三条铁律

  1. 只在自己的 my-… 分支写。main 和 lesson-* 是只读起点,不修改、不提交、不推送。
  2. 一次只做一件事。写一点 → 编译 → 测试 → 通过 → 提交 → 再写下一点。一次只处理一个 ★TODO。
  3. 勤于提交。宁可多提交几次;有了提交记录,撤销的成本几乎为零。
⛔ 请勿使用没有老师在旁边时,请勿使用会「删除内容」的命令:git reset --hard、git push -f、git clean -f、git branch -D。它们可能导致提交丢失。需要撤销时,请先请老师帮忙。

🆘 卡住了怎么办

最常见的几种情况与安全的处理办法。拿不准时,先停下来请教老师,不要随意尝试删除类命令。

「我是不是在错的分支上?」

运行 git branch,看 * 在哪。想换到自己的课:git switch my-lesson-2(这里没有 -c,因为分支已经建过了)。

「切分支时提示有未提交的改动」

先把它们提交:git add -A 再 git commit。提交后再 switch。

「代码改乱了,想回到本节课刚开始的样子」

最稳妥的办法:把改坏的那个文件单独还原成刚开课的版本,例如 git checkout upstream/lesson-2 -- src/main.cpp(只还原这一个文件,不影响其他)。拿不准时请老师帮忙。

「push 时被拒绝了」

多半是漏了第一次的 -u origin 分支名。第一次推送某条分支,要用 git push -u origin my-lesson-2。仍不行,就把完整的报错信息发给老师。

🗂️ 命令速查表

忘记时可查阅此表。N 代表课程编号。

什么时候命令作用
整门课一次git clone …把你的复刻拉到电脑
整门课一次git remote add upstream …记住老师的库
整门课一次复刻的 Actions 页点绿色按钮启用工作流(不点就不会自动评测)
每节课开头git fetch upstream取回老师最新的课
每节课开头git switch -c my-lesson-N --no-track upstream/lesson-N新建一条自己的分支
写代码时make test自查是否正确(不是 git 命令,但每次都用)
提交git add <文件>选出这次要提交的文件
提交git commit提交一次 + 填写说明
备份/上交git push -u origin my-lesson-N首次上传到你的 GitHub
查看现状git status · git branch · git log --oneline只查看、不修改,可放心使用