3、Git工作流:Fork仓库、创建分支、提交PR、Code Review流程、Squash提交
好,咱们进入第三章。这一章聊的是Git工作流,说白了就是你怎么跟NuttX社区打交道。我见过太多新手,代码写得不错,结果PR提交得乱七八糟,被维护者打回来重做。嗯,咱们今天就把这事捋清楚。
3.1 为什么要用Fork工作流?
NuttX的主仓库在apache/nuttx上。你直接往那上面推代码?不行,你没权限。社区的做法是:你先Fork一份到自己名下,改好了再通过PR(Pull Request)把代码送回去。
我个人习惯把Fork叫做「我的私人副本」。你在GitHub上点一下Fork按钮,就会在你自己账号下生成一个仓库,比如你的名字/nuttx。这个仓库跟主仓库是独立的,你想怎么改都行。
核心原则:永远不要直接在主仓库上开发。Fork + PR 是开源社区的黄金法则。
3.2 创建分支:别在main上干活
很多人Fork完仓库,直接就在main分支上改代码。这是个大坑。为什么?因为main分支应该保持跟上游同步,你改了之后,下次想同步上游就麻烦了。
我建议你这样做:
# 先克隆你的Fork
git clone git@github.com:你的名字/nuttx.git
cd nuttx
# 添加上游仓库
git remote add upstream https://github.com/apache/nuttx.git
# 创建功能分支
git checkout -b fix-spi-bug
分支命名也有讲究。我个人习惯用「类型/简短描述」的格式:
fix/spi-driver-crash— 修bugfeat/add-i2c-support— 加新功能doc/update-readme— 改文档
这样维护者一看分支名,就知道你要干嘛。
3.3 提交PR:别一股脑全推上去
代码改完了,提交PR。这里有个关键点:PR要小。我在项目中遇到过有人一个PR改了50个文件,涉及3个不同的功能。结果呢?维护者看了两周还没看完,最后要求拆开。
一个PR只做一件事。这是铁律。
提交PR的步骤:
- 确保你的分支是基于最新的上游main
- 运行本地测试,确保不破坏现有功能
- 提交PR时,写清楚「做了什么」和「为什么做」
小技巧:PR描述里可以加「Closes #123」这样的关键字,合并后会自动关闭对应的Issue。
3.4 Code Review流程:别怕被怼
PR提交后,维护者会来Review。说白了就是挑毛病。我第一次给NuttX提PR时,被要求改了4次。当时心里挺不爽的,后来发现人家是对的。
Review时维护者会关注这些:
| 检查项 | 常见问题 |
|---|---|
| 代码风格 | 缩进不对、命名不规范 |
| 逻辑正确性 | 边界条件没处理、内存泄漏 |
| 兼容性 | 破坏了其他架构的编译 |
| 文档 | 新功能没写注释或文档 |
收到Review意见后,别急着反驳。先想想人家说的有没有道理。如果确实有问题,就在本地改,然后重新推送。GitHub会自动更新PR。
注意:Review过程中,不要关闭PR重新开。直接在原PR上迭代就好。关闭PR重新开会被视为不专业的行为。
3.5 Squash提交:让历史干净一点
你改一个bug,可能提交了5次:第一次写代码,第二次修拼写错误,第三次加注释……这些提交记录对别人来说毫无意义。维护者希望看到的是:一个功能,一个提交。
这时候就需要Squash(压缩提交)。
操作很简单:
# 查看最近的提交
git log --oneline
# 压缩最近3个提交
git rebase -i HEAD~3
在打开的编辑器里,把后面的提交前面的pick改成squash(或简写s)。保存退出后,会让你写一个新的提交信息。
嗯,这里要注意:不要Squash已经推送到远程的分支,除非你确定没人基于你的分支开发。如果已经推送了,需要用git push --force强制推送。
我的经验:在PR Review过程中,我一般不会Squash。等Review通过、准备合并前,再做一次Squash,把整个PR压缩成一个干净的提交。这样维护者合并时也省心。
3.6 避坑指南
我曾经犯过一个低级错误:在Fork的仓库里直接改了main分支,然后提交PR。结果上游更新了,我这边合并冲突一大堆。后来学乖了,永远在功能分支上开发。
还有一次,我忘了添加upstream远程仓库,结果同步上游时搞了半天。你想想看,如果连上游都不同步,你的代码可能跟主线差了好几个版本,合并起来痛苦死。
最后说一句:Git工作流这东西,光看没用。你得动手练。找个简单的bug修一下,走一遍完整的流程:Fork → 分支 → 修改 → PR → Review → Squash → 合并。走完一遍,你就懂了。