GitHub 实验课:第一个 issue 和 PR
📎 HA7CH School(github.com/HA7CH/ha7ch-school)一线 FDE 从业者实战讲义。展开来源 +收起来源 −
[来源] HA7CH School(github.com/HA7CH/ha7ch-school)一线 FDE 从业者实战讲义。
原文为导师带学讲义(github.com/HA7CH/ha7ch-school),正文已改写为自学课文:面向导师的调度指令已删除,「讲完这节你应该能答上」可用于自测。
本线目录(22 课)
本课目录(13 节)
共修节点 · GitHub 实验课:第一个 issue 和第一个 PR,就提在这所学校
学习目标
- 能在真仓库 HA7CH/ha7ch-school 上完成人生第一个 issue(入学打卡)和第一个 PR(往 WALL.md 末尾加上自己那一行)
- 能用"我表达意图、agent 执行、我验收"的 AI native 姿势协作:干活的命令零行,表达意图和验收归你
- 能走完 fork → branch → commit → push → PR 全流程,在 Files changed 里看懂 diff,并在 PR 正文带上可自动关单的
Closes #N - 能在 gh CLI 不可用时走网页流降级路径,并理解 merge 是道真实的异步关——开出 PR 即成功
实操对象:https://github.com/HA7CH/ha7ch-school (公开仓库,你正在上的这所学校本身)+ 校友墙 WALL.md(合并后自动上线 (原文链接) )。依赖:概念课那六个词的理解——真懂 Git 的话,开场 30 秒补齐即可。
这不是模拟、不是沙盒。你今天将真实地:开出人生第一个 issue(入学打卡)→ 提出人生第一个 PR(把自己的名字写上校友墙)→ 被 Lawted 真实 review、合并后名字自动上线 school.ha7ch.com/WALL.md。六个词里前五个(repo/commit/branch+PR/issue/fork)这节课在真仓库上走完;第六个 merge 是道真实的异步关——开出 PR 即成功。
这节课要干什么(一句话)
你将用"我表达意图、agent 执行、我验收"的 AI native 姿势,在 HA7CH/ha7ch-school 上完成:①第一个 issue(入学打卡);②第一个 PR(往 WALL.md 末尾加上自己那一行)。干活的命令全程零行——你唯一亲手做的是注册和登录授权,那是认证,不是干活。
开场(把实操钉在理念上)
"概念课里说过(刚补过的也算):命令是 agent 的事,词汇和判断是你的事。光听不算数。这节课你亲手走一遍——你只对我说话,我来跑命令;每一步我都会告诉你现在发生的事对应哪个词。做完之后,'开 issue''提 PR''fork''merge'这几个词对你就不再是名词解释,而是你干过的事。而且对象是真的:你的 PR 会被 Lawted 本人 review,合并那一刻起,school.ha7ch.com/WALL.md 上就有你的名字。"
Lawted 自己的工作方式就是这样的(一手原话,出处《我愿称之为🚽开发法》):他修自己产品的 bug,流程就是——"我只管定位问题和建 issue,代码肯定不动",然后让 Claude Code 去干,最后 agent 汇报"全部打包在 PR #102 中,等待你在 iPhone 上验证后合并"。你今天做的,就是他每天做的。
分工原则(谁干什么,先说清)
- 你只做三件事:注册/登录 GitHub(唯一要你亲手做的)、用自然语言说你想留什么话、在关键节点点头验收。
- 其余全交给你的 agent:跑全部命令(
ghCLI);让它每一步用六个词解说"刚才发生了什么";每个真实 URL 都自己点开看。 - 节奏:一步一确认,别一口气跑完——这节课的价值一半在动作、一半在解说。
- 没上过概念课直接进本课(真懂 Git 的彩蛋路径):开场先花 30 秒把六个词过一遍(跳过"概念课里说过"那句),其余照走。
上手步骤(一步一确认)
第 0 步 · 检查装备
- GitHub 账号:没有 → 浏览器打开 https://github.com 注册。username 选个以后不脸红的——这就是你在这个世界的行业名片(Lawted 简历上印的就是 github.com/lawted 这类地址)。
ghCLI(gh --version):没有 → macOSbrew install gh;装不上直接走下面的网页流(见"降级路径")。- 登录:跑
gh auth status,核对回显的账号就是你自己的 username(公司电脑/借用机器常残留别人的登录,不是就重新登录切换)。要登录时推荐gh auth login --web -h github.com:终端会给一个 8 位一次性码 → 回车自动开浏览器 → 把码贴进去 → 页面上点 Authorize。提示里问到 "Authenticate Git with your GitHub credentials?" 选 Yes(否则待会儿 push 还会另外要密码;已经跳过的话事后补一句gh auth setup-git)。交互卡住就换系统自带终端(Terminal / iTerm)跑同一条命令。 - git 身份:跑
git config --global user.name和git config --global user.email,为空就用你自己的名字和 GitHub 注册邮箱设上——不设的话待会儿 commit 会直接报 "Please tell me who you are"。 - 点破一句(顺带回扣):刚才这些都是认账凭证,不是 AI 额度——GitHub 全程不收你一个 token。上过 cv-pro 实验课的话,想想
cv_pat_:同一个道理;还没上过,以后到那节课你会再拿到一个类似的凭证,到时想起今天这一步。
第 1 步 · 第一个 issue:入学打卡
- 想好你要留什么话(从哪来、想学什么、想对学校说一句什么——三行以内,别写作文)。
- 让 Claude 来跑(内容用你的原话,别让它替你编),并立刻保存返回的 Issue URL 和编号——后面开 PR 时必须引用:
(正文三行都用你的原话;引号里用真实换行,别写
\n——bash 不会把它变成换行。确认ISSUE_NUMBER是纯数字再继续;如果会话中断,重新从 Issue URL 取编号,不能猜。) - 把返回的 issue URL 自己点开看:你刚在一个公开项目里,发出了你的第一条正式协作记录——它有编号、有你的名字、全网可见、永久可查,这就是"公开台账"。
- FDE 线的你加一句:你刚干的事,缩小一万倍就是 FDE 的日常——把嘴里的话变成一条可追踪的 issue。Lawted 的原话:"……把这种极其模糊的需求逐渐梳理成明确的工作流,再变成 GitHub Issue,最后才变成生产级别的代码。"
第 2 步 · 第一个 PR:上校友墙
逐步跑、逐步解说(让 Claude 每步先说"现在要做 X,对应的词是 Y"再动手):
- fork(复印):
gh repo fork HA7CH/ha7ch-school --clone→ "刚才两件事一起发生了:把整所学校复印了一份到你名下(fork)——没人批准,也不需要批准;再把你名下这份下载到了电脑上(clone),生成了ha7ch-school/这个目录。" 接着cd ha7ch-school——后面每一条命令都必须在这个目录里跑,别在你自己的项目目录里动 git。 - branch(平行草稿):
git checkout -b wall/{你的handle}→ "现在开了一份平行草稿,名字叫wall/{handle}。接下来怎么改都动不到正本——这就是 branch 存在的意义。" - 改:打开
WALL.md,照文件里写明的格式,在末尾追加一行(日期用今天、@你的 username、一句话用你自己的话)。改完让 Claude 把这一行念给你确认——这是你的名字,一个字都要你点头。 - commit(存档点):
git add WALL.md && git commit -m "wall: 新同学 @{handle} 上墙"→ "存档打好了:谁、何时、改了哪一行、为什么,写进历史了。" - push + 开 PR(请过目):
git push -u origin wall/{你的handle}→ "push = 把你电脑上打好的存档送回你 GitHub 名下的那份复印件,这样全世界才看得到。" 然后开 PR,正文末尾必须带上Closes #Issue编号,这样合并时入学打卡 Issue 才会自动关闭: → "申请单递出去了——从你的复印件,提回学校正本。" 验收 PR 正文确实出现了可点击的Closes #N;只写#N不会自动关闭 Issue。 - 看 diff(验收界面):把 PR URL 自己点开 → 点 Files changed → 绿色那一行就是你加的。以后你让任何 agent 改任何东西,验收看的就是这个界面。今天你在墙的这一侧(提交方),以后你多数时候在另一侧(把关方)。
第 3 步 · 等 merge(真实世界的自动验收也是课)
- 如实说明:校友墙机器人会先做一轮硬边界 review——只改
WALL.md、只在末尾加本人一行、格式正确,就自动合并;任何越界修改都不会自动动手,仍由 Lawted 人工 review。PR 开出来,这节课就已经成功。 - 再预告一件可能发生的事:如果有同学排在你前面先合并了,你的 PR 可能显示 conflict(两个人都改了文件末尾同一处)——这不是你做错了。机器人会验收新增行后安全汇总进主干,并在原 PR 留下回执;这本身就是真实协作的一课。
- PR 合并或被安全汇总后,机器人只在
Closes #N明确指向同一作者的 Issue,或同一作者恰好只有一条入学 Issue 时,把它标记为 completed;证据不唯一就保留给人工判断。 - 讲完最后一环:merge 之后,Vercel 会自动重新部署,不用任何人"发版",几分钟内刷新 (原文链接) 就能看到你的名字——这就是"merge 即上线"。把这个网址存下来,明后天自己来看。
降级路径(按序尝试,别假装)
ghCLI 装不上 / 本机环境跑不了命令 → 走网页流,全程点鼠标:浏览器打开 (原文链接) → 点右上角铅笔 ✏️(Edit)→ GitHub 会提示需要 fork,点一下 "Fork this repository" 即进入编辑器(别以为卡住了)→ 末尾加一行 → 点 "Commit changes…"(GitHub 会自动把改动放进你 fork 的一个新分支)→ 照引导点到 "Create pull request"。顺势点破:GitHub 已经把 fork→branch→PR 整条流程做成了点鼠标的路径,网页流和命令流殊途同归。issue 同理可在仓库的 Issues 页点 "New issue" 手写。- 网络到不了 github.com(部分网络环境常见)→ 如实说明,换网络重试;实在不通,就把两步流程按上面的解说完整读一遍,留成下次再做的作业。
- 不想公开留名 → 完全可以。username 本来就可以不是真名;再不行就只开 issue 不上墙、或干脆先围观——随便打开仓库里一个真实 PR 的 diff,看看别人怎么写。上墙永远是邀请,不是要求。
成功信号
- issue URL 和 PR URL 都真实存在、你亲眼点开过自己那条;
- 你能指着 PR 的 Files changed 说出"这行是我加的"。
- (不要求 merge 完成——那是道真实的异步关。)
做完必回扣(这才是实验课的理解检验)
- "除了登录授权那一下,你亲手敲过一行干活的命令吗?那你干的是什么?"
- 好答案信号:没有;我干的是表达意图(issue 内容、墙上那行话)和验收(确认 diff)——正好是 Lawted 说的"判断问题、澄清需求、定义边界"那半,命令那半归 agent。
- "用你自己的话说:issue 和 PR 各是干嘛的?"
- 好答案信号:issue = 把事挂到台面上(需求/问题的公开台账);PR = 把改动正式提请过目(带 diff 的申请单)。
- FDE 线的你:"你和客户之间,issue 和 PR 分别对应 Echo/Delta 的哪半?"(issue 是 Echo 的落点——摸清的需求落成台账;PR 是 Delta 的交付单元——做出来的东西提请验收。) AI Native 线的你:"这套流程里哪一步印证了'零 token'那套生态逻辑?"(好答案信号:整条协作链公开、免费、不烧一个 token;产品和课程都长在这条公开基础设施上。)
小结
- 你今天在真仓库上走完了 fork → branch → commit → push → PR(外加开 issue):干活的命令零行,表达意图和验收全是你的——正是 Lawted 说的"判断问题、澄清需求、定义边界"那半。
- 记下你的 issue URL 和 PR URL:merge 是道真实的异步关,过几天回来看看状态。
- merge 后记得回 (原文链接) 看自己名字上线——那一眼,比这节课讲的任何话都记得牢。
- 回主线接着走:FDE 线接下来常接《实验课:被诊断一次与货代擂台》(刚练的"把话变成 issue"马上要在擂台用);AI Native 线接下来常接《实验课:把你的简历变活》——都不是规定,按你此刻的状态定。
随堂测QUIZ
逐题作答,即时反馈
1. 在创建入学打卡 issue 后,导师为什么立刻保存返回的 Issue URL 和编号?
2. 关于 PR 正文中写“Closes #编号”的说法,正确的是?
3. 在这节 GitHub 实验课中,下列哪一项不是学生亲手做的事?
