跳转至

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) 地址。后续的 fetchswitchmergerebase 命令与其他 GitLab 实例并无本质区别。

2 每个实验一个分支

课程每次通常会发布一个实验分支(例如 lab1lab2)。你需要先从 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 后续继续该实验时

如果你当前不在目标实验分支,先切换回去:

$ git switch <lab分支名>

3 日常提交流程

最常用的提交流程如下:

$ git status
$ git add <文件名>
$ git commit -m "<提交说明>"
$ git push origin <lab分支名>

提交前自检

提交前建议先执行 git status,确认自己已经位于正确的实验分支,并且改动范围符合预期。

4 个人功能分支与 merge

什么时候需要功能分支

如果你要做一个相对独立的修改,例如“重构某个函数”“单独调试一个 bug”“尝试另一种实现方式”,建议临时开一个功能分支,而不是直接在实验分支上边改边试。

4.1 创建功能分支

$ git switch <lab分支名>
$ git switch -c <功能分支名>

例如:

$ git switch lab1
$ git switch -c fix-exec-bug

随后在这个功能分支上修改代码、提交代码:

$ git add <文件名>
$ git commit -m "lab1: fix exec bug"

4.2 合并回实验分支

当你确认功能分支中的修改没问题后,可以切回实验分支并执行 merge

$ git switch <lab分支名>
$ git merge <功能分支名>
$ git push origin <lab分支名>

合并完成后,如果这个功能分支已经不再需要,可以删除:

git branch -d <功能分支名>

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分支名> 出现冲突时:

  1. 打开冲突文件,手动保留正确内容并删除冲突标记;
  2. 执行 git add <冲突文件> 标记已解决;
  3. 执行 git rebase --continue 继续变基;
  4. 若需放弃本次变基,执行 git rebase --abort

5.2 merge 冲突处理

如果你在执行 git merge <功能分支名> 时发生冲突:

  1. 手动修改冲突文件;
  2. 执行 git add <冲突文件>
  3. 执行 git commit 完成本次合并;
  4. 若想放弃这次合并,执行 git merge --abort

6 常用撤销命令

git restore --staged <文件名>  # 取消暂存,保留工作区改动
git restore <文件名>           # 丢弃工作区改动(谨慎)
git revert <提交哈希>          # 新建一次“反向提交”,不改历史

7 提交规范建议

  • 一次提交只做一件事;
  • 提交信息应简洁且可读,建议包含实验编号;
  • 在执行 mergerebase 之前,尽量先把当前工作提交干净;
  • 推送前执行 git status,确认仅包含本次实验改动。

参考资料