进度与提交 / 学生版
你的进度,是怎么亮起来的
这门课不用交作业,也不用发消息告诉老师「我做完了」。你只要把代码 push 上去,GitHub 会自己帮你检查一遍,课程地图上那一格就会亮。这一页把整个循环讲清楚 —— 看完你就知道每一步为什么这么做。
🔄 一节课的循环
先看全景。下面这一圈,每节课都跑一遍 —— 学会一次,后面每节课都一样。
老师 push lesson-2 ──▶ 你 fetch + 开一条 my-lesson-2
│
填 ★TODO → make test(本地自查)
│
git commit → git push
│
GitHub 自动跑评测(你不用点任何按钮)
│
commit 打 ✓/✗ ──▶ 课程地图亮灯
- 老师发布新课。老师把第 N 课的起点放在老师库的
lesson-N分支上 —— 前面几课已经写好的部分都在,本课要你写的部分留空。 - 你取回新课,开出自己的分支。从
lesson-N开一条属于你的my-lesson-N。以后所有改动都发生在这条分支上。 - 你照着手册填
★TODO。写一点、编译一下、再写一点。别一口气写完再编译。 - 本地先自查。
make test,看有没有[FAIL]。红了就照它提示的改。 - 提交并推送。
git commit存个档,git push把存档传到 GitHub。 - GitHub 自动跑一遍评测。它盯着你的
my-lesson-*分支,你一 push 它就自己开始,不用你点任何按钮。前提是你在复刻的 Actions 页点过一次「启用工作流」(见下一节第 3 步)—— 没点过的话,push 上去会安安静静什么都不发生。 - 结果回到你眼前。commit 旁边出现 ✓ 或 ✗,课程地图上第 N 课那一格跟着亮。
commit 是存档(存在你自己电脑上),push 是把存档传到 GitHub。没 push,外面什么都看不见 —— 老师看不到,地图也不会亮。很多人第一次都会卡在这里:本地全绿了却一直不亮灯,回头一看是忘了 push。🔧 只做一次的准备
下面这几件事,整门课只做一次。做完就不用再管了。
1. 有一个 GitHub 账号
没有的话去 github.com/signup 注册一个,用户名记牢 —— 后面查进度要用到它。
2. 把老师的库 Fork 到你名下 —— 必须选 Public
打开老师的库 xianyudd/first-frame,点右上角的 Fork。这一步相当于把整个项目复印一份到你自己的账号下,之后你想怎么改都不影响老师那份。
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,点它。
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 用户名(只填一次,浏览器会帮你记住),做过哪几课、哪几课过了,一眼就能看出来。
my-lesson-2 这个格式吗?④ fork 是 Public 吗?四样都对,地图读的就是你 fork 上这条分支最新一次评测的结果。🧪 本地测试 和 云端评测,各管什么
同一份评测程序,跑在两个地方。分工不一样,两个都要用。
本地 make test | 云端自动评测 | |
|---|---|---|
| 什么时候跑 | 你想跑就跑,随时 | 每次 push 到 my-lesson-N 自动跑 |
| 谁看得见 | 只有你自己 | 老师、课程地图都读它 |
| 要等多久 | 一两秒 | 两三分钟(服务器要从源码编译 raylib) |
| 有什么用 | 边写边改,反馈最快 | 存档证明 + 地图亮灯 |
打个比方:本地是草稿纸,云端是交卷。在草稿纸上改到全绿了,再交一次卷。云端一次要跑两三分钟,所以别改一个字就 push 一次 —— 攒到一处 TODO 做完再 push,节奏最舒服。
📏 三条纪律
不是规矩多,是这三条踩了最花时间。
- 只在自己的
my-lesson-N分支上写。别往main推,也别改lesson-N:main上只有课程网站,lesson-N是老师发下来的起点。动了起点,下次取新课就会打架。 - 别改
tests/里的文件。那是这一课的考卷。改它确实能把红变绿,但学到的东西也一起改没了 —— 而且老师点开你的改动记录一眼就能看出来。真觉得题目本身有问题,直接告诉老师。 - 小步提交。一处 TODO 做完、
make test过了,就 commit 一次。写错了能退回去,卡住了也更容易说清是哪一步出的问题。
🧭 卡住了怎么办
按这个顺序排查,绝大多数情况前三步就解决了。
- 看
[FAIL]那一行。它写了期望(expected)和实际(got)。多数情况是数值或判断条件差一点,对着手册那一处 TODO 再读一遍。 - 编译报错,从最上面一行看起。报错常常是一串的 —— 第一个才是真正的原因,下面那些是被它带出来的连锁反应。
- 本地全绿,云端却 ✗。多半是忘了 push 最新代码,或者 push 到了别的分支。运行
git status和git branch各看一眼,确认当前在my-lesson-N上、且没有未提交的改动。 - 完全没头绪。把这次
[FAIL]的原文(或者报错的最上面几行)发给老师,说清你做到哪一步、期望它怎么样。不要为了让红色变绿去改tests/。