工具手册 / 只讲你用得到的
Git 闯关指南
Git 是你的「存档系统」:写好一小块就提交一次,随时可以回到之前的版本,改动出错也能恢复。这一页只讲这门课真正会用到的几步,照着做即可。
🧠 三个词,看懂 Git
先建立整体印象,后面的命令就好理解了。
1. 仓库(repository / repo)
就是你这个项目的文件夹,外加它完整的历史。Git 会把每一次改动都记录下来,随时可以查看。
2. 存档(commit)
如同游戏里的存档点。写好一小块、测试通过,就提交一次。之后任何时候都可以回到某个提交,查看当时的状态。
3. 分支(branch)
一条平行的时间线。你在自己的分支上修改、提交,都不会影响别人的分支。每节课,都新建一条属于自己的分支来写。
upstream(原件,你只读、只从这里取新课);你 Fork 出来的那份叫 origin(你的复印件,你往这里提交和备份)。若记混,可用 git remote -v 查看。🔧 第一次配置(整门课只做一次)
目的:把老师的库复印一份到你名下,再拉到自己电脑上。
- 在 GitHub 打开老师的库 xianyudd/first-frame,点右上角 Fork,复刻到你自己的账号。保持 Public,不要改成 Private。
- 在你复刻的 Actions 页启用工作流(只点这一次):打开
https://github.com/<你>/first-frame/actions,点绿色按钮 I understand my workflows, go ahead and enable them。GitHub 规定复刻出来的仓库默认不跑任何工作流 —— 不点这一步,后面 push 不会有任何反应,也不会报错。 - 把你自己的那份复刻 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,弄清「当前在哪条分支、有无未提交的改动」,再决定下一步。📏 三条铁律
- 只在自己的
my-…分支写。main和lesson-*是只读起点,不修改、不提交、不推送。 - 一次只做一件事。写一点 → 编译 → 测试 → 通过 → 提交 → 再写下一点。一次只处理一个
★TODO。 - 勤于提交。宁可多提交几次;有了提交记录,撤销的成本几乎为零。
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 | 只查看、不修改,可放心使用 |