Skip to content

被迫成为 Git 高手 —— Gerrit 的连续提交评审

前因

学校实训课老师要求使用 Gerrit + Jenkins 实现代码评审和 CI/CD 的工业化开发和团队协作。我被分配了一个构建前端页面的工作。

总所周知,AI 会一下子吐一大堆东西。然而 Gerrit 的规范要求尽可能 Commit 小,以减轻 Reviewer 心智负担。尽管我写的是一个框架性的内容,那确实代码量很大,但对于一次 Code Review 来说,加上各种说明文档和测试用例大概快 3500 行了,这能认真看肯定是不现实的。

本来是还想把框架和一个 Hook 输入框错误处理给分开来,但已经全部修改掉了,于是最终采取了一个折中的拆分方案:

text
cc48d8f # feat(web): 搭建工作台路由、应用壳与核心页面框架
0c08b75 # test(web): 补充路由、表单校验与任务流程测试覆盖
af48213 # docs: 更新当前前端架构说明

我忘记本地跑了 ESLint 和各种测试,然后就兴致勃勃地提交了;我的 Codex 也忘记这茬了,这就是事情的开始。

爆了

Gerrit 第一次报错

噔 噔 咚。

查了一下,发现是 ESLint 报错。

Jenkins 第一次报错

那么问题来到了,如何去修改这第一次提交呢?

bash
git rebase -i HEAD~3

然后我惊讶的发现,这根本不行!不知道咋回事,提交记录就是乱了。那只能请出 git reflog 然后再 git switch -c cc48d8f了。最后也是有惊无险恢复分支。

text
edit cc48d8f # feat(web): 搭建工作台路由、应用壳与核心页面框架
pick 0c08b75 # test(web): 补充路由、表单校验与任务流程测试覆盖
pick af48213 # docs: 更新当前前端架构说明

这样之后,交互式变基工具就会回滚到第一次提交,然后把上面的这个未使用变量修了就解决问题了。

git push origin HEAD:refs/for/main 定能终结这问题。

又爆了

解决了吗? Jenkins 第二次报错

这回是集成测试爆了,我想起来,拆 Commit 的时候忘记把集成测试改了。

这里的问题倒也没那么恐怖,再搞一次git rebase -i HEAD~3就行。但是这一次提交会和第二次改测试脚本冲突。

不过所幸的是,交互式变基工具会直接到第二次冲突的地方,然后就和常规的Merge Conflict处理一样:删掉特殊标记,手动合并文件。

再修了之后,也算是最终解决了。Gerrit里,这样的连续提交会标识出一个Relation Chain,更加易读。 Gerrit 结果

教训

一定要在提交之前记得跑 Linter 和 Tests。

也是因祸得福,学习了一些 Git 的实用技巧,之后闯祸了还能救回来。