Git 提交、分支与合并¶
本节目标
你将掌握课程实验里最常用的后续 Git 工作流:切换实验分支、日常提交代码、开功能分支、merge/rebase 同步更新,以及在出现冲突时完成处理。
先读哪一页
本页侧重后续日常 Git 工作流。若你还没有在希冀 GitLab 中创建空项目、也还没有把课程仓库配置成 upstream/origin 双远程,请先阅读 实验0:希冀平台与课程仓库接入。
前置条件
你至少应已经完成 实验0:内核编译运行与 GDB 调试,并在本地成功执行过一次 git clone。如果你只是想提前熟悉 Git 常用命令,也可以把本页当作参考材料阅读。
预计用时
作为参考阅读,本节预计 10~20 分钟。
命令执行位置
除非特别说明,下面所有命令都默认在课程仓库根目录 nexos 中执行。
1 开始前确认¶
开始前,建议先确认你已经按 Lab0 的仓库接入说明完成双远程配置。
$ git --version
git version 2.43.0
$ cd nexos
$ git remote -v
origin https://cscourse.ustc.edu.cn/vdir/Gitlab/<你的学号>/nexos.git (fetch)
origin https://cscourse.ustc.edu.cn/vdir/Gitlab/<你的学号>/nexos.git (push)
upstream https://git.ustc.edu.cn/KONC/nexos.git (fetch)
upstream https://git.ustc.edu.cn/KONC/nexos.git (push)
$ git config --global user.email
<你的邮箱>
课程平台当前只使用 HTTP(S)
希冀 GitLab 当前不使用 SSH 推送,因此本文所有 origin 示例都采用 HTTP(S) 地址。后续的 fetch、switch、merge、rebase 命令与其他 GitLab 实例并无本质区别。
2 每个实验一个分支¶
课程每次通常会发布一个实验分支(例如 lab1、lab2)。你需要先从 upstream 获取该分支,再把它推送到自己的 origin。
2.1 首次获取某个实验分支¶
$ git fetch upstream --prune
From https://git.ustc.edu.cn/KONC/nexos
* [new branch] lab1 -> upstream/lab1
$ git switch --track upstream/<lab分支名>
branch '<lab分支名>' set up to track 'upstream/<lab分支名>'.
Switched to a new branch '<lab分支名>'
$ git push -u origin <lab分支名>
To <你的私有仓库远程地址>
* [new branch] <lab分支名> -> <lab分支名>
branch '<lab分支名>' set up to track 'origin/<lab分支名>'.
2.2 后续继续该实验时¶
如果你当前不在目标实验分支,先切换回去:
3 日常提交流程¶
最常用的提交流程如下:
提交前自检
提交前建议先执行 git status,确认自己已经位于正确的实验分支,并且改动范围符合预期。
4 个人功能分支与 merge¶
什么时候需要功能分支
如果你要做一个相对独立的修改,例如“重构某个函数”“单独调试一个 bug”“尝试另一种实现方式”,建议临时开一个功能分支,而不是直接在实验分支上边改边试。
4.1 创建功能分支¶
例如:
随后在这个功能分支上修改代码、提交代码:
4.2 合并回实验分支¶
当你确认功能分支中的修改没问题后,可以切回实验分支并执行 merge:
合并完成后,如果这个功能分支已经不再需要,可以删除:
5 同步课程更新与处理冲突¶
如果助教对课程实验分支有更新,你需要把 upstream 的改动同步到本地实验分支:
$ git switch <lab分支名>
$ git pull --rebase upstream <lab分支名>
From https://git.ustc.edu.cn/KONC/nexos
* branch <lab分支名> -> FETCH_HEAD
Already up to date.
$ git push origin <lab分支名>
Everything up-to-date
5.1 rebase 冲突处理¶
当执行 git pull --rebase upstream <lab分支名> 出现冲突时:
- 打开冲突文件,手动保留正确内容并删除冲突标记;
- 执行
git add <冲突文件>标记已解决; - 执行
git rebase --continue继续变基; - 若需放弃本次变基,执行
git rebase --abort。
5.2 merge 冲突处理¶
如果你在执行 git merge <功能分支名> 时发生冲突:
- 手动修改冲突文件;
- 执行
git add <冲突文件>; - 执行
git commit完成本次合并; - 若想放弃这次合并,执行
git merge --abort。
6 常用撤销命令¶
git restore --staged <文件名> # 取消暂存,保留工作区改动
git restore <文件名> # 丢弃工作区改动(谨慎)
git revert <提交哈希> # 新建一次“反向提交”,不改历史
7 提交规范建议¶
- 一次提交只做一件事;
- 提交信息应简洁且可读,建议包含实验编号;
- 在执行
merge或rebase之前,尽量先把当前工作提交干净; - 推送前执行
git status,确认仅包含本次实验改动。