Git提交信息写得好,后面排查问题、写周报、回退代码都方便。写得烂,过两天你自己都不知道改了啥。这节给你一套能直接用的提交规范。
一、为什么要规范提交信息
烂的提交信息
TEXT
修改
更新
aaa
fix bug
测试
.
过两周回头看,完全不知道每次提交改了什么。
好的提交信息
TEXT
feat: 新增用户登录接口,支持账号密码登录
fix: 修复用户列表分页total字段为0的问题
refactor: 重构订单服务,抽取公共方法
docs: 更新README中的数据库配置说明
一眼就知道每次提交做了什么。
规范的好处
- 自己方便:回退代码时知道该回到哪个版本
- 同事方便:Code Review时快速了解改动
- 排查bug方便:出了问题能快速定位是哪次提交引入的
- 生成CHANGELOG:可以自动生成版本更新日志
- 写周报方便:翻git log就知道这周干了啥
二、Conventional Commits规范
业界广泛使用的提交规范,格式:
TEXT
<type>(<scope>): <subject>
<body>
<footer>
type(必填)
提交类型,取值如下:
| type | 说明 | 示例 |
|---|---|---|
| feat | 新功能 | 新增用户注册接口 |
| fix | 修复bug | 修复登录超时问题 |
| docs | 文档变更 | 更新API文档 |
| style | 代码格式(不改逻辑) | 格式化代码缩进 |
| refactor | 重构(不改功能不修bug) | 抽取公共方法 |
| perf | 性能优化 | 优化查询SQL |
| test | 测试相关 | 新增用户服务单元测试 |
| build | 构建/依赖变更 | 升级SpringBoot版本 |
| ci | CI/CD相关 | 修改Jenkins配置 |
| chore | 杂项(不修改源码也不改测试) | 更新.gitignore |
| revert | 回退之前的提交 | 回退feat: 用户注册 |
scope(可选)
影响的范围/模块,比如:
TEXT
feat(user): 新增用户登录接口
fix(order): 修复订单状态不更新的问题
refactor(auth): 重构权限校验逻辑
subject(必填)
简短描述,一行,不超过50个字符。
规则:
- 用中文或英文都行,团队统一就好
- 不加句号
- 用祈使句("新增"而不是"新增了")
- 首字母大写(英文)或直接写(中文)
body(可选)
详细描述,说明改了什么、为什么改。
footer(可选)
关联issue、标记Breaking Change等。
三、提交信息模板
模板1:简洁版(日常开发用)
TEXT
feat: 新增用户登录接口
一行搞定,简单明了。
模板2:标准版(推荐)
TEXT
feat(user): 新增用户登录接口
- 新增POST /api/user/login接口
- 支持账号密码登录
- 登录成功返回JWT Token
type + scope + subject,空一行后写body。
模板3:完整版(重大改动用)
TEXT
feat(auth): 新增JWT认证体系
- 引入jjwt库实现Token生成和校验
- 新增登录接口返回Token
- 新增Token拦截器校验请求
- 新增Token刷新接口
BREAKING CHANGE: 所有接口需要Authorization头
Closes #123
四、实际使用示例
新功能
TEXT
feat(user): 新增用户注册功能
- 新增POST /api/user/register接口
- 注册参数:用户名、密码、邮箱
- 密码使用BCrypt加密存储
- 邮箱格式校验
修复bug
TEXT
fix(order): 修复订单金额计算精度丢失
- BigDecimal运算改为使用setScale保留2位小数
- 修复金额累加时精度丢失的问题
重构
TEXT
refactor(user): 重构用户服务层
- 抽取UserValidator公共校验方法
- UserMapper方法重命名使其更语义化
- 删除未使用的废弃方法
性能优化
TEXT
perf(user): 优化用户列表查询性能
- 用户列表查询改为分页查询
- 添加索引到create_time字段
- 查询时间从2s优化到200ms
文档
TEXT
docs: 更新数据库初始化说明
- 补充Redis安装步骤
- 修正MySQL端口号说明
回退
TEXT
revert: 回退feat(user): 新增用户注册功能
回退原因:注册接口存在安全漏洞,暂时回退修复后再上线
五、IDEA配置提交模板
方法1:Live Templates
File → Settings → Editor → Live Templates
- 点
+→ Template Group → 起名git-commit - 再点
+→ Live Template
Abbreviation(缩写): gcfeat
Template text:
TEXT
feat: $SUBJECT$
$BODY$
定义变量: 点Edit variables,给$SUBJECT$和$BODY$设默认值。
配几个常用的:
gcfeat→feat: $SUBJECT$gcfix→fix: $SUBJECT$gcdocs→docs: $SUBJECT$gcrefactor→refactor: $SUBJECT$
提交时在信息框输入缩写按Tab,自动展开。
方法2:配置Git提交模板文件
创建.gitmessage文件:
TEXT
# type: feat/fix/docs/style/refactor/perf/test/build/ci/chore/revert
# scope: 影响的模块(可选)
# subject: 简短描述(必填)
#
# 详细描述(可选)
#
# BREAKING CHANGE: 破坏性变更说明(可选)
# Closes: #issue编号(可选)
#
# <type>(<scope>): <subject>
#
# <body>
#
# <footer>
配置Git使用此模板:
Shell
git config --global commit.template .gitmessage
以后git commit(不带-m)时会自动打开模板。
六、Git Commit Message Hook
用Git Hook在提交时自动校验提交信息格式。
安装commitlint
Shell
# 安装
npm install -g @commitlint/cli @commitlint/config-conventional
# 创建配置文件
echo "module.exports = {extends: ['@commitlint/config-conventional']};" > commitlint.config.js
配置Git Hook
在项目.git/hooks/commit-msg:
Shell
#!/bin/sh
npx --no-install commitlint --edit "$1"
提交信息不符合规范时直接拒绝提交。
七、.gitignore模板
Java项目标准.gitignore:
TEXT
# ===== IDE =====
.idea/
*.iml
*.ipr
*.iws
.vscode/
.settings/
.project
.classpath
# ===== 编译输出 =====
target/
build/
out/
bin/
*.class
# ===== 日志 =====
*.log
logs/
# ===== 系统文件 =====
.DS_Store
Thumbs.db
# ===== 配置文件(含密码等敏感信息) =====
application-local.yml
application-prod.yml
application-local.properties
application-prod.properties
# ===== 临时文件 =====
*.tmp
*.bak
*.swp
*~
# ===== 包文件 =====
*.jar
*.war
*.ear
*.zip
*.tar.gz
# 注意:如果你需要把jar提交到Git,去掉上面这行
前端项目.gitignore
TEXT
# ===== 依赖 =====
node_modules/
# ===== 构建输出 =====
dist/
build/
# ===== 日志 =====
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# ===== 环境变量 =====
.env.local
.env.*.local
# ===== IDE =====
.idea/
.vscode/
*.suo
*.ntvs*
*.njsproj
*.sln
# ===== 系统文件 =====
.DS_Store
Thumbs.db
八、分支命名规范
| 分支类型 | 命名规则 | 示例 |
|---|---|---|
| 功能分支 | feature/功能描述 | feature/user-login |
| 修复分支 | hotfix/或fix/问题描述 | hotfix/null-pointer |
| 发布分支 | release/版本号 | release/v1.2.0 |
| 主干 | main或master | main |
| 开发分支 | develop | develop |
命名建议
- 用英文,不用中文
- 用中划线分隔单词
- 包含工号或姓名(可选):feature/zhangsan-user-login
- 简短但有意义:feature/login好过feature/new-feature
九、提交频率建议
什么时候提交
- 完成一个小功能时 — 不要攒一大堆改动才提交
- 修复一个bug后 — 修复和验证后立即提交
- 下班前 — 把当天的改动提交,别留到明天
- 阶段性完成后 — 比如完成了一个模块的CRUD
提交粒度
TEXT
# 好的提交粒度:每次提交一个完整的小功能
git commit -m "feat(user): 新增用户列表分页查询接口"
git commit -m "feat(user): 新增用户新增接口"
git commit -m "feat(user): 新增用户编辑接口"
# 不好的提交粒度:一次提交太多改动
git commit -m "feat: 完成用户管理所有功能(列表、新增、编辑、删除、导入、导出)"
不要提交的文件
target/编译输出.idea/IDE配置application-local.yml含密码的本地配置*.log日志文件node_modules/前端依赖
十、团队协作建议
提交前
git pull拉最新代码- 解决冲突
- 自测:确认代码能编译、能运行
- 检查有没有debug代码、测试代码、注释掉的代码
git diff检查改动
提交后
git push推送到远程- 如果需要合并到主干,发Merge Request/Pull Request
- 在MR里写清楚改了什么、为什么改、怎么测试的
MR描述模板
Markdown
## 改动说明
本次改动主要做了以下事情:
1. 新增用户登录接口
2. 修复用户列表分页问题
## 改动原因
1. 产品需求:用户需要登录功能
2. Bug修复:分页total返回0
## 测试方式
1. 启动后端服务
2. 访问 POST /api/user/login,传入用户名密码
3. 验证返回Token
4. 访问 GET /api/user/list,验证分页正常
## 影响范围
- 用户模块
- 认证模块
小结
| 要点 | 说明 |
|---|---|
| 提交格式 | type(scope): subject |
| type | feat/fix/docs/refactor/perf/test/chore |
| 提交粒度 | 一个小功能一次提交 |
| 提交频率 | 完成一个小功能就提交 |
| .gitignore | 排除编译文件、IDE配置、密码文件 |
| 分支命名 | feature/fix/release + 描述 |
好的提交习惯是区分新手和成熟开发者的标志之一。