← 迷你肉鸽 / 课程主页

进度与提交 / 学生版

你的进度,是怎么亮起来的

这门课不用交作业,也不用发消息告诉老师「我做完了」。你只要把代码 push 上去,GitHub 会自己帮你检查一遍,课程地图上那一格就会亮。这一页把整个循环讲清楚 —— 看完你就知道每一步为什么这么做。

🔄 一节课的循环

先看全景。下面这一圈,每节课都跑一遍 —— 学会一次,后面每节课都一样。

老师 push lesson-2   ──▶   你 fetch + 开一条 my-lesson-2
                                    │
                          填 ★TODO  →  make test(本地自查)
                                    │
                          git commit  →  git push
                                    │
                  GitHub 自动跑评测(你不用点任何按钮)
                                    │
                     commit 打 ✓/✗   ──▶   课程地图亮灯
  1. 老师发布新课。老师把第 N 课的起点放在老师库的 lesson-N 分支上 —— 前面几课已经写好的部分都在,本课要你写的部分留空。
  2. 你取回新课,开出自己的分支。从 lesson-N 开一条属于你的 my-lesson-N。以后所有改动都发生在这条分支上。
  3. 你照着手册填 ★TODO。写一点、编译一下、再写一点。别一口气写完再编译。
  4. 本地先自查。make test,看有没有 [FAIL]。红了就照它提示的改。
  5. 提交并推送。git commit 存个档,git push 把存档传到 GitHub。
  6. GitHub 自动跑一遍评测。它盯着你的 my-lesson-* 分支,你一 push 它就自己开始,不用你点任何按钮。前提是你在复刻的 Actions 页点过一次「启用工作流」(见下一节第 3 步)—— 没点过的话,push 上去会安安静静什么都不发生。
  7. 结果回到你眼前。commit 旁边出现 ✓ 或 ✗,课程地图上第 N 课那一格跟着亮。
这一圈里,你只需要记住两个词commit 是存档(存在你自己电脑上),push 是把存档传到 GitHub。没 push,外面什么都看不见 —— 老师看不到,地图也不会亮。很多人第一次都会卡在这里:本地全绿了却一直不亮灯,回头一看是忘了 push。

🔧 只做一次的准备

下面这几件事,整门课只做一次。做完就不用再管了。

1. 有一个 GitHub 账号

没有的话去 github.com/signup 注册一个,用户名记牢 —— 后面查进度要用到它。

2. 把老师的库 Fork 到你名下 —— 必须选 Public

打开老师的库 xianyudd/first-frame,点右上角的 Fork。这一步相当于把整个项目复印一份到你自己的账号下,之后你想怎么改都不影响老师那份。

Fork 时保持 Public(公开),不要改成 Private私有复刻有两个后果:GitHub 不给你跑自动评测,老师也读不到你的进度 —— 地图永远不会亮,而你本地 make test 明明全绿,会非常困惑。这门课 fork 出去的都是公开的起点代码,没有什么需要藏起来的东西。

3. 在你复刻的 Actions 页启用工作流(只点这一次)

打开 https://github.com/<你>/first-frame/actions(把 <你> 换成你的用户名)。页面上会挂着一条提示 —— Workflows aren't being run on this forked repository —— 旁边有个绿色按钮 I understand my workflows, go ahead and enable them,点它。

这一步不能跳GitHub 规定:复刻出来的仓库默认不跑任何工作流。不点这个按钮,你 push 多少次都不会有评测、commit 旁边不会出现 ✓/✗、课程地图永远不亮 —— 而且不会有任何报错提醒你,看起来就像什么都没发生。这是最容易卡住、又最难自己想明白的一步。

4. 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 remote -v,应当同时看到 origin(你的复刻)和 upstream(老师的库)两个。两个都在,就算配置完成了。

第一次用 Git、或者上面这些命令看着眼生,先看站内的 《Git 闯关指南》 —— 那里把每个命令为什么这么写都讲了。

🚀 每节课的动作

每开一节新课,照这个顺序来。下面以第 2 课为例,换成你要上的课号即可。

git fetch upstream                                      # 1. 取回老师最新的课
git switch -c my-lesson-2 --no-track upstream/lesson-2   # 2. 从第2课起点,开一条自己的分支

# 3. 打开 src/main.cpp,按手册一处一处填 ★TODO

make test                                       # 4. 本地自查:全绿再往下
git commit -am "第2课:完成 TODO 1-3"           # 5. 存档
git push -u origin my-lesson-2                  # 6. 传到 GitHub
  • 第 2 步的 --no-track 别省:不加它,这条分支会被「挂」到老师那条 upstream/lesson-2 上(git status 会显示成跟它一致),而且你忘了写 -u origin 时,git push 会吐一大段看不懂的提示。加上它,忘了 -u 也会直接告诉你该敲哪条命令。
  • 第 2 步的分支名就照这个格式起:my-lesson-2。云端评测和课程地图都靠这个名字认出「这是你的第 2 课」,起成 homework 之类的名字它们就看不见了。
  • -u 只有第一次 push 新分支时要写,之后同一条分支上直接 git push 就行。
  • 不必一次填完全部 TODO 再 push。填完一处、make test 还红着,也可以先 commit 存档 —— 存的是你自己的进度,不是交卷。等这一课全部填完、本地全绿,再 push 一次,那一次的结果才会在地图上定格。
本地全绿 ≠ 这一课做完了自动评测只管得了逻辑:数值对不对、函数有没有按规则算。画面类的改动(贴图大小、位置、颜色)它管不着。所以每课收尾前记得 make run 亲眼看一遍 —— 评测全过但画面上怪叠在一起,这课也还不算完。

👀 怎么看结果

push 之后不用做别的,结果会自己回到你眼前。三个地方能看,从粗到细。

① commit 旁边的小图标(最快)

在你 fork 的 GitHub 页面上点 Commits,每条 commit 右边都有一个小圆点:

  • 绿色 ✓ —— 这次 push 的评测全过了。
  • 红色 ✗ —— 还有没通过的项,点进去看是哪些。
  • 黄色转圈 —— 还在跑,等一两分钟。

② Actions 页看逐条(最细)

点那个 ✓/✗ 进到本次运行,Summary 里有评测的完整输出:[PASS] 是通过的,[FAIL] 会写清它期望什么(expected)、实际得到什么(got)。对着手册看那一处 TODO,基本就能改对。

③ 课程地图看全局(最直观)

回课程主页的「课程地图」,填上你的 GitHub 用户名(只填一次,浏览器会帮你记住),做过哪几课、哪几课过了,一眼就能看出来。

地图不亮,先查这四样① 你 push 了吗?② 复刻的 Actions 页点过「启用工作流」吗?③ 分支名是 my-lesson-2 这个格式吗?④ fork 是 Public 吗?四样都对,地图读的就是你 fork 上这条分支最新一次评测的结果。

🧪 本地测试 和 云端评测,各管什么

同一份评测程序,跑在两个地方。分工不一样,两个都要用。

本地 make test云端自动评测
什么时候跑你想跑就跑,随时每次 push 到 my-lesson-N 自动跑
谁看得见只有你自己老师、课程地图都读它
要等多久一两秒两三分钟(服务器要从源码编译 raylib)
有什么用边写边改,反馈最快存档证明 + 地图亮灯

打个比方:本地是草稿纸,云端是交卷。在草稿纸上改到全绿了,再交一次卷。云端一次要跑两三分钟,所以别改一个字就 push 一次 —— 攒到一处 TODO 做完再 push,节奏最舒服。

📏 三条纪律

不是规矩多,是这三条踩了最花时间。

  1. 只在自己的 my-lesson-N 分支上写。别往 main 推,也别改 lesson-N:main 上只有课程网站,lesson-N 是老师发下来的起点。动了起点,下次取新课就会打架。
  2. 别改 tests/ 里的文件。那是这一课的考卷。改它确实能把红变绿,但学到的东西也一起改没了 —— 而且老师点开你的改动记录一眼就能看出来。真觉得题目本身有问题,直接告诉老师。
  3. 小步提交。一处 TODO 做完、make test 过了,就 commit 一次。写错了能退回去,卡住了也更容易说清是哪一步出的问题。

🧭 卡住了怎么办

按这个顺序排查,绝大多数情况前三步就解决了。

  • 看 [FAIL] 那一行。它写了期望(expected)和实际(got)。多数情况是数值或判断条件差一点,对着手册那一处 TODO 再读一遍。
  • 编译报错,从最上面一行看起。报错常常是一串的 —— 第一个才是真正的原因,下面那些是被它带出来的连锁反应。
  • 本地全绿,云端却 ✗。多半是忘了 push 最新代码,或者 push 到了别的分支。运行 git status 和 git branch 各看一眼,确认当前在 my-lesson-N 上、且没有未提交的改动。
  • 完全没头绪。把这次 [FAIL] 的原文(或者报错的最上面几行)发给老师,说清你做到哪一步、期望它怎么样。不要为了让红色变绿去改 tests/。
最后一句红色的 ✗ 不是扣分,是提示。它出现的次数跟你的水平没关系 —— 它出现的次数只说明你还在写。看见 ✗ 就照着 expected / got 改,改完再 push,这是这门课最正常不过的节奏。