夜雨聆风学习资料网

ARTICLE · 1052221

AI再牛掰我也建议你自己提Git,给你一份大厂通用的Git规范,别让同事因为Git再蛐蛐你

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拉出,测试完毕同时合并到maindevelop

hotfix/*:线上紧急故障修复,从main拉出,修复后同时合并maindevelop

适合有固定版本计划,需要维护多个历史版本的大型项目。

但流程略显繁琐,所以一般团队全套照搬会很“重”,可以做一些裁剪,去掉release分支,用tag标记版本。

分支名上最好也讲究点儿!

分支名就像分支的身份证,不用点开代码,一眼识别用途、关联需求

通用格式:类型/[工单号]-简短语义描述

前缀
用途
正确示例
反面错误示例
feature/
新业务功能
feature/PROJ‑123‑user‑register
feature/testfeature/aaa
bugfix/
测试环境bug修复
bugfix/PROJ‑234‑order‑calc
bugfix/fixbug
hotfix/
线上紧急故障修复
hotfix/PROJ‑456‑pay‑crash
hotfix/临时改线上
release/
版本准备
release/v2.2.0
release/新版本
chore/
工程、依赖、CI配置改动
chore/update‑springboot‑version
chore/改配置

所以,命名上有几个建议,仅供参考:

  • 强制带上JIRA/工单编号,需求、bug一键溯源;

  • 全部小写,用横杠分隔单词,禁止中文、空格;

  • release/hotfix带上语义版本号;

  • 分支合并完成之后,及时删除远程、本地临时分支,避免仓库分支泛滥。

03

PART

Commit提交规范

Commits

commit message是Git的“日记”。

线上排障git blame的时候,如果看到提交备注只有“修改”“修复bug”,排查效率直接大打折扣。这也是这两天“干仗”的主要原因。

大厂统一采用 Conventional Commits约定式提交 标准,格式:

<type>(<scope>): <subject>  【可选空行】 <body>  【可选空行】 <footer>

我搞了一个简单的提交类型对照表:

type
释义
示例
feat
新增业务功能
feat(user): 增加短信登录
fix
修复bug(测试/线上)
fix(pay): 修复金额精度丢失
docs
文档注释变更
docs(readme): 更新部署文档
style
仅格式调整,不改业务逻辑(空格、换行、分号)
style: 统一代码缩进
refactor
代码重构,无新增功能、无bug修复
refactor(order): 抽取公共查询方法
perf
性能优化
perf(cache): 提升缓存命中率
test
单元测试、集成测试新增修改
test(auth): 补充登录单元用例
chore
工程构建、依赖、脚手架杂项改动
chore: 升级项目依赖包
ci
流水线CI配置修改
ci: 调整流水线超时时间
revert
回滚历史提交
revert: 回滚v2.1登录逻辑

写的时候可以向下面这么写:

# 简单情况 

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

相关学习资料