💜 想真正擅长编程? 从一门课程开始,100% 免费

4-1、Git提交规范

Git提交信息写得好,后面排查问题、写周报、回退代码都方便。写得烂,过两天你自己都不知道改了啥。这节给你一套能直接用的提交规范。


一、为什么要规范提交信息

烂的提交信息

TEXT
修改
更新
aaa
fix bug
测试
.

过两周回头看,完全不知道每次提交改了什么。

好的提交信息

TEXT
feat: 新增用户登录接口,支持账号密码登录
fix: 修复用户列表分页total字段为0的问题
refactor: 重构订单服务,抽取公共方法
docs: 更新README中的数据库配置说明

一眼就知道每次提交做了什么。

规范的好处

  1. 自己方便:回退代码时知道该回到哪个版本
  2. 同事方便:Code Review时快速了解改动
  3. 排查bug方便:出了问题能快速定位是哪次提交引入的
  4. 生成CHANGELOG:可以自动生成版本更新日志
  5. 写周报方便:翻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

  1. 点+ → Template Group → 起名git-commit
  2. 再点+ → 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

九、提交频率建议

什么时候提交

  1. 完成一个小功能时 — 不要攒一大堆改动才提交
  2. 修复一个bug后 — 修复和验证后立即提交
  3. 下班前 — 把当天的改动提交,别留到明天
  4. 阶段性完成后 — 比如完成了一个模块的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/ 前端依赖

十、团队协作建议

提交前

  1. git pull 拉最新代码
  2. 解决冲突
  3. 自测:确认代码能编译、能运行
  4. 检查有没有debug代码、测试代码、注释掉的代码
  5. git diff 检查改动

提交后

  1. git push 推送到远程
  2. 如果需要合并到主干,发Merge Request/Pull Request
  3. 在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 + 描述

好的提交习惯是区分新手和成熟开发者的标志之一。