ARTICLE · 1052221
AI再牛掰我也建议你自己提Git,给你一份大厂通用的Git规范,别让同事因为Git再蛐蛐你
大家很多时候只是把Git只当成“代码备份工具”,提交记录一堆“改bug、更新文件”,分支随便建、合并随心所欲。
一旦线上故障,排查历史如同大海捞针。
其实Git规范不是为了约束开发者,而是一套“降低协作成本的工具”,就像道路交规,不是限制开车,而是保障大家通行安全高效。
01
PART
前言
Prologue
这两天因为Git的问题,团队内部有点儿“干仗”。
其实也不赖某个人,几十、上百人的团队共同维护一套代码,如果没有统一Git准则,出事儿是早晚的。
我不知道你有没有遇到过:
线上出Bug,翻提交记录看不懂到底改了什么;
多人开发频繁发生分支冲突,代码被意外覆盖;
CI/CD流水线无法自动生成更新日志,版本发布全靠手动复制;
新人接手项目,看不懂分支用途,不知道代码演进逻辑。
其实一线大厂并不是开发者技术更强,而是靠一套完整Git规范+自动化工具,把风险挡在合并主分支之前。
所以咱们捋捋到底Git怎么用更好,风险更低,什么“姿势”才更正确。
02
PART
分支
Branches
分支是Git协作的“脊梁骨”,不同业务节奏,适合完全不同的模型。
咱们可以把分支理解成建筑工地:长期分支就是永久地基,短期分支就是临时脚手架,用完就要拆除。
2010年提出的经典企业级方案(Git Flow),区分2条长期永久分支、3条临时短期分支。
长期分支(永远不能删除)
main/master:生产环境稳定代码,严禁直接push提交,只有发布、热修复才会合入。
develop:开发主分支,所有新功能汇总在这里。
短期临时分支(开发完成合并后删除)
feature/*:新功能,从develop拉出,完成合并回develop;
release/*:版本发布准备分支,从develop拉出,测试完毕同时合并到main与develop;
hotfix/*:线上紧急故障修复,从main拉出,修复后同时合并main、develop。
适合有固定版本计划,需要维护多个历史版本的大型项目。
但流程略显繁琐,所以一般团队全套照搬会很“重”,可以做一些裁剪,去掉release分支,用tag标记版本。
分支名上最好也讲究点儿!
分支名就像分支的身份证,不用点开代码,一眼识别用途、关联需求。
通用格式:类型/[工单号]-简短语义描述
所以,命名上有几个建议,仅供参考:
强制带上JIRA/工单编号,需求、bug一键溯源;
全部小写,用横杠‑分隔单词,禁止中文、空格;
release/hotfix带上语义版本号;
分支合并完成之后,及时删除远程、本地临时分支,避免仓库分支泛滥。
03
PART
Commit提交规范
Commits
commit message是Git的“日记”。
线上排障git blame的时候,如果看到提交备注只有“修改”“修复bug”,排查效率直接大打折扣。这也是这两天“干仗”的主要原因。
大厂统一采用 Conventional Commits约定式提交 标准,格式:
<type>(<scope>): <subject> 【可选空行】 <body> 【可选空行】 <footer>
我搞了一个简单的提交类型对照表:
写的时候可以向下面这么写:
# 简单情况
feat(user): 新增手机号验证码登录
fix(pay): 修复第三方回调超时异常
# 复杂说明
fix(payment): 修复支付回调偶发超时
问题根因:第三方网关响应波动,30秒阈值过小,大量请求超时失败
解决方案:
1. 将接口超时调整为60秒
2. 增加最多3次重试逻辑
3. 异常落日志,返回处理中状态
关联工单:PROJ‑123
因为Commit要写的规范,所以建议大家不要攒着提交,一次提交只解决一类问题,不要把无关改动塞进同一个commit。
所以单次提交代码量不宜过大,PR/MR建议控制500‑800行以内。
最后说一句:提交前自测!提交前自测!提交前自测!
04
PART
合并
Merging
如果说,merge就像两条马路汇合,保留完整分叉历史。
那么rebase变基相当于“搬家”,把自己分支所有提交,挪到目标分支最新节点后面,生成干净线性历史。
我劝你千万不要做下面的操作:
已经推送到远程公共分支,严禁rebase + force push!多人协作改写公共分支历史,会造成团队所有人代码错乱,极大概率丢代码。
rebase只能用于自己本地、只有自己开发的私有分支。
git push --force尽量不用,确需强制覆盖优先使用更安全的git push --force‑with‑lease,会校验远程没有别人新增提交才覆盖。
如果提交已经推送到远程,想要撤销代码,使用git revert生成反向提交,绝对不要reset --hard之后强制推送公共分支。reset适合还没有推送本地提交。
05
PART
自动化
Automation
靠口头要求团队遵守,一定会有人忘记。无论你培训多少次,无论你要求多少遍,都一定有人会忘记。
所以,大厂方案是:工具拦截,不满足规范根本提交、合并不了。
husky + commitlint:git commit钩子校验commit message格式,格式错误直接拒绝提交;
lint‑staged + prettier/eslint/checkstyle:pre‑commit钩子,提交前自动格式化、静态检查,代码格式错误阻止提交;
分支命名校验:CI脚本或者仓库钩子校验分支前缀,不符合命名规则无法推送;
CI质量门禁:编译、单元测试、代码扫描、安全漏洞扫描,任意一项失败,禁止合并;
standard‑version:基于规范commit自动生成CHANGELOG变更日志,自动升级版本号。
建议大家可以优先搞定husky+commitlint,投入产出比最高。
06
PART
Tag版本管理
Versioning
版本号遵循语义化版本规范:主版本.次版本.修订号 X.Y.Z
X主版本号:不兼容API重大改动;
Y次版本号:向下兼容新增业务功能;
Z修订号:向下兼容bug修复。
# 创建带备注的annotated标签(不要用轻量tag) git tag -a v2.2.1 -m "Release v2.2.1 修复支付超时问题" # 推送到远程仓库 git push origin v2.2.1
注意:线上发布必须使用带注释的tag,不要使用无备注轻量tag,方便追溯每个版本对应代码快照。
07
PART
避坑
Pitfalls
好的规范收益自然不用我多说,但是建立规范的过程坑点是一定会有的,而且几乎必踩!
所以,建立规范的过程中:
工具落地,只写文档等于摆设;
团队初期切换,会有学习适应成本;
拒绝过度设计!规范的目的是省事,不是增加开发负担。十几个人以内小团队,不需要全套复杂Git Flow,做简化版本即可;
规范不是一成不变,跟随团队规模迭代调整。
08
PART
结语
Closing
很多团队看到我前面一大套就快吐了,其实根本不需要一次性全部落地,可以分三步渐进改造:
第一步:统一Commit Message格式
投入产出最高,接入commitlint + husky,先把提交信息管住。
第二步:选定简化版分支模型
最少保证:main生产分支 + develop开发分支,feature从develop拉出,hotfix从main拉出,临时分支用完删除。
第三步:开启分支保护和PR评审
禁止直接push主分支,所有改动走PR,最少一人评审再合并,CI检查必须通过。
CLOSING
拒绝过度设计!规范的目的是省事,不是增加开发负担。
我是李剑一,希望我们一起进步,共勉!
如果这篇 Git 规范对你有用,点个赞、在看、收藏三连支持一下,我们下篇见~
THANKS FOR READING