Git故事化提交消息技能Skill git-storytelling-commit-messages

这个技能提供编写Git提交消息的指南,帮助开发人员创建清晰、信息丰富的提交消息,以讲述开发过程的故事,便于代码审查、项目管理和自动化工具使用。关键词:Git提交消息、代码文档、版本控制、软件开发、DevOps、提交策略。

DevOps 0 次安装 2 次浏览 更新于 3/25/2026

名称: git-storytelling-commit-messages 描述: 使用于编写清晰传达变更并讲述开发故事的提交消息。帮助创建信息丰富、结构良好的提交消息,作为文档。 允许工具:

  • Bash
  • Read

Git故事化 - 提交消息

这个技能指导您如何编写清晰、信息丰富且讲述开发过程的提交消息。良好的提交消息是伴随代码的文档。

核心原则

提交消息的用途

提交消息服务于多个受众和目的:

  • 未来开发者(包括您自己)理解为什么进行更改
  • 代码审查者评估更改的意图和范围
  • 项目经理跟踪进度和理解交付内容
  • 自动化工具生成变更日志和发布说明
  • Git工具如blame、log和bisect用于调试

三部分结构

有效的提交消息遵循一致的结构:

  1. 主题行:简短摘要(50字符以内)
  2. 正文(可选):详细解释什么和为什么
  3. 页脚(可选):问题引用、重大更改、合作作者

主题行格式

<类型>: <描述>

示例:
feat: 添加用户认证系统
fix: 解决支付处理中的竞态条件
docs: 更新v2端点的API文档

提交消息解剖

主题行规则

应该:

  • 以类型前缀开头(feat、fix、docs等)
  • 使用祈使语气(“添加”而不是“已添加”或“添加了”)
  • 保持在50字符以内
  • 不以句号结尾
  • 冒号后首字母大写
  • 具体和描述性

不应该:

  • 使用模糊术语如“更新东西”或“修复问题”
  • 包含文件名除非必要
  • 描述如何完成(代码显示细节)
  • 使用过去时
  • 太通用

正文指南

正文应解释:

  • 什么改变了(简要,代码显示细节)
  • 为什么需要更改
  • 任何副作用或影响
  • 考虑的替代方案
  • 不明显的上下文

格式:

  • 每行换行在72字符
  • 使用项目符号表示多个项目
  • 与主题行用空行分隔
  • 使用适当段落进行复杂解释

页脚元素

引用: #123, #456
关闭: #789
重大更改: API端点/用户现在需要认证
合作作者: Jane Doe <jane@example.com>

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

提交类型

feat: 新功能

用于添加新功能或能力。

feat: 添加密码重置功能

实现带邮箱验证的密码重置流程:
- 生成安全重置令牌
- 发送带过期的重置邮件
- 在允许密码更改前验证令牌
- 记录密码重置事件用于安全审计

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

fix: 错误修复

用于纠正缺陷或意外行为。

fix: 防止重复订单提交

添加客户端去抖和服务器端幂等检查
以防止用户在快速点击时意外提交相同订单
多次。

关闭: #234

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

docs: 文档

用于仅文档更改。

docs: 添加数据库选择的架构决策记录

记录为什么我们选择PostgreSQL而不是MongoDB作为
主要数据存储,包括性能基准和
团队专业知识考虑。

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

refactor: 代码重构

用于改进代码而不改变行为。

refactor: 将认证逻辑提取到中间件

将认证检查从单独的路由处理程序
移动到可重用中间件以减少重复并改进
可维护性。

认证行为无功能更改。

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

test: 测试更改

用于添加或修改测试。

test: 添加支付流程的集成测试

添加端到端测试覆盖:
- 成功支付处理
- 失败支付处理
- 退款处理
- Webhook事件处理

测试覆盖率从65%提高到82%。

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

perf: 性能改进

用于改进性能的更改。

perf: 优化用户仪表板中的数据库查询

替换N+1查询模式为单个JOIN查询,减少
对于100+项目的用户,仪表板加载时间从2.3s到0.4s。

在user_id和created_at列添加数据库索引。

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

style: 格式化更改

用于空白、格式化、缺少分号等。

style: 用prettier格式化代码

在所有TypeScript文件中应用prettier格式化
以保持一致的代码风格。无功能更改。

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

chore: 维护任务

用于例行任务、依赖更新、构建更改。

chore: 升级依赖到最新稳定版本

更新所有npm包以解决安全漏洞:
- express: 4.17.1 -> 4.18.2
- axios: 0.21.1 -> 1.4.0
- jest: 27.0.6 -> 29.5.0

升级后所有测试通过。

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

代码示例

示例1: 带上下文的功能

feat: 实现Webhook签名验证

添加入站Webhook的HMAC-SHA256签名验证
以确保请求是真实的且未被篡改。

实现细节:
- 从X-Webhook-Signature头部验证签名
- 使用时序安全比较以防止时序攻击
- 无效签名返回401
- 记录可疑Webhook尝试

生产启动前所需的安全措施。

引用: #567

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

示例2: 带根本原因的修复

fix: 解决事件监听器清理中的内存泄漏

事件监听器在组件挂载时添加但未在
卸载时移除,导致内存积累和浏览器
在多次导航循环后变慢。

根本原因: useEffect钩子中缺少清理函数。

解决方案: 返回清理函数以在组件卸载时移除所有事件监听器。

此错误影响广泛导航应用而不刷新的用户,
特别在10+页面转换后明显。

关闭: #892

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

示例3: 带动机的重构

refactor: 用async/await替换回调地狱

转换嵌套回调式错误处理为async/await
模式以提高可读性和可维护性。

之前: 5层嵌套回调
之后: 线性async/await流程

好处:
- 更容易理解错误处理
- 阅读代码时减少认知负担
- 更简单地向流程添加新步骤
- 调试时更好的堆栈跟踪

无行为更改,所有现有测试通过。

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

示例4: 重大更改

feat: 迁移到带重大更改的v2 API

更新API客户端以使用改进错误处理
和响应格式的v2端点。

重大更改: 响应格式已更改
- 旧: { data: {...}, status: "ok" }
- 新: { result: {...}, success: true }

迁移指南:
1. 更新响应处理程序以使用'result'而不是'data'
2. 检查'success'布尔值而不是状态字符串
3. 错误响应现在包括'error.code'字段

所有内部服务已更新。第三方集成者
需要更新其代码。

引用: #1001

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

示例5: 性能优化

perf: 为频繁访问数据实现Redis缓存

为不常更改但每次请求访问的用户配置文件数据
添加Redis缓存层。

指标:
- 缓存命中率: 1小时流量后94%
- 平均响应时间: 450ms -> 45ms
- 数据库负载: 减少80%

缓存失效策略:
- 1小时后过期
- 配置文件更新时失效
- 缓存未命中时回退到数据库

通过REDIS_URL环境变量配置。

引用: #445

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

示例6: 安全修复

fix: 净化用户输入以防止XSS攻击

在渲染前转义用户生成内容中的HTML实体
以防止跨站脚本攻击。

漏洞: 用户可以在配置文件
bio字段注入<script>标签,这会在其他用户浏览器中执行。

修复: 使用DOMPurify库净化所有用户输入
在存储和渲染前。

受影响字段:
- 用户配置文件bio
- 评论内容
- 自定义状态消息

安全严重性: 高
生产中无已知利用。

关闭: #778

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

示例7: 配置更改

chore: 配置自动依赖更新

设置Dependabot以自动检查和创建
依赖更新的PR,按每周计划。

配置:
- 每周检查npm依赖
- 测试通过后自动合并补丁更新
- 次要/主要更新需要手动审查
- 按依赖类型分组更新

这将帮助我们保持安全补丁最新
并减少手动维护负担。

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

示例8: 回滚

revert: 回滚Redis缓存实现

回滚“perf: 为频繁访问数据实现Redis缓存”

由于缓存失效错误导致向用户提供过时数据,回滚。
缓存策略需要重新设计以正确处理所有更新场景。

发现问题:
- 部分配置文件更新未失效缓存
- 缓存写入和数据库写入之间的竞态条件
- 高负载下的缓存踩踏

将在后续PR中重新实现并修复。

引用: #445

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

何时使用此技能

使用此技能当:

  • 为任何代码更改编写提交消息
  • 在开发工作流中创建提交
  • 准备代码审查的提交
  • 为开源项目贡献
  • 在具有共享git历史的团队项目中工作
  • 记录重要技术决策
  • 创建发布说明或变更日志
  • 使用git bisect调试问题
  • 教导他人git最佳实践
  • 建立团队git约定

最佳实践

  1. 提交前编写提交消息 - 思考消息有助于澄清提交内容

  2. 使用祈使语气 - “添加功能”而不是“已添加功能”或“添加了功能”

  3. 用空行分隔主题和正文 - 许多git工具所需

  4. 限制主题行在50字符 - 迫使您简洁和周到

  5. 正文在72字符换行 - 保持消息在各种工具中可读

  6. 解释为什么,而不是什么 - 代码显示什么改变了,消息解释为什么

  7. 引用问题和PR - 在代码和需求之间创建可追溯性

  8. 使用约定提交格式 - 实现自动化变更日志生成

  9. 在页脚中包含重大更改 - 对语义版本控制关键

  10. 提及副作用 - 提醒他人非明显后果

  11. 配对时列出合作作者 - 给予应有信用

  12. 具体范围 - “fix: 解决登录错误”而不是“fix: 认证中的错误”

  13. 描述解决的问题 - 不仅仅是实施的解决方案

  14. 包括相关指标 - 性能改进、测试覆盖率等

  15. 使用一致术语 - 匹配代码库和文档中使用的术语

常见陷阱

  1. 模糊主题行 - “修复错误”无任何有用信息

  2. 主题行中包含过多细节 - 细节保存到正文

  3. 使用过去时 - “已修复错误”而不是“修复错误”

  4. 缺少正文解释 - 非明显更改需要上下文

  5. 仅为自己编写 - 记住其他人会阅读

  6. 描述实现而不是意图 - 专注于为什么

  7. 忘记引用问题 - 破坏可追溯性

  8. 不一致的提交类型 - feat/feature/add混合使历史混乱

  9. 主题和正文之间无空行 - 在许多工具中破坏格式

  10. 主题行以句号结尾 - 不必要且浪费字符限制

  11. 编写文章长度的提交消息 - 简洁但完整

  12. 修正时未更新提交消息 - 旧消息可能不再准确

  13. 通用消息如“更新”或“更改” - 这些提供零价值

  14. 将文件名放入主题 - 通常从差异中明显

  15. 缺少重大更改警告 - 可能破坏下游消费者

资源

Git文档

工具

  • git commit - 标准提交命令
  • git commit --amend - 修改最后一次提交消息
  • git log --oneline - 查看缩写提交历史
  • git log --format=fuller - 查看完整提交信息
  • git show <commit> - 查看完整提交详情
  • git rebase -i - 编辑历史提交消息

检查您的消息

# 查看最近提交消息
git log --oneline -10

# 查看带差异的完整提交消息
git show HEAD

# 检查主题行是否太长
git log --format="%h %s" | awk 'length($0) > 52 { print }'

# 查看当前分支的所有提交消息
git log main..HEAD --format="%B"

# 按作者查看提交
git log --author="您的名字" --format="%h %s"

消息模板

创建提交消息模板:

# 创建模板文件
cat > ~/.gitmessage << EOF
# <类型>: <主题>

# <正文>

# <页脚>

# 类型可以是:
#    feat     (新功能)
#    fix      (错误修复)
#    refactor (重构代码)
#    style    (格式化、缺少分号等)
#    test     (添加缺少测试)
#    docs     (文档更改)
#    chore    (更新构建任务、依赖等)
#    perf     (性能改进)
EOF

# 配置git使用模板
git config --global commit.template ~/.gitmessage

预提交钩子

使用commit-msg钩子强制执行消息格式:

#!/bin/bash
# .git/hooks/commit-msg

commit_msg=$(cat "$1")
pattern="^(feat|fix|docs|style|refactor|test|chore|perf):"

if ! echo "$commit_msg" | grep -qE "$pattern"; then
    echo "错误: 提交消息必须以类型前缀开头"
    echo "示例: feat: 添加新功能"
    exit 1
fi

# 检查主题行长度
subject=$(echo "$commit_msg" | head -n1)
if [ ${#subject} -gt 50 ]; then
    echo "警告: 主题行超过50字符"
    echo "长度: ${#subject}"
fi

exit 0

相关技能

  • git-storytelling-commit-strategy: 何时提交和频率
  • git-storytelling-branch-strategy: 为清晰开发叙事管理分支
  • code-reviewer: 良好提交消息如何改进代码审查

高级模式

多组件更改

当更改影响多个组件时:

feat: 添加用户通知系统

实现跨应用的实时通知:

后端更改:
- 添加推送通知的WebSocket服务器
- 在数据库中创建通知存储
- 实现通知API端点

前端更改:
- 向头部添加通知铃图标
- 创建通知面板组件
- 连接到WebSocket以获取实时更新

更改跨越客户端和服务器以交付完整
通知功能。

引用: #234, #235, #236

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

带测试的错误修复

修复错误时,包括测试信息:

fix: 处理日期格式化中的null值

日期格式化器在传递null时会抛出异常,
导致整个页面崩溃。

修复: 添加null检查并为null日期返回空字符串。

测试: 添加单元测试以验证null处理和边缘情况
对于undefined、空字符串和无效日期格式。

之前: 应用在null日期上崩溃
之后: 优雅处理所有无效日期输入

关闭: #567

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

带迁移说明的依赖更新

chore: 升级React 17到React 18

更新React到版本18以改进并发渲染
和自动批处理功能。

执行的迁移步骤:
1. 更新react和react-dom到18.2.0
2. 替换ReactDOM.render为createRoot
3. 更新新渲染API的测试配置
4. 验证所有组件与新并发功能兼容

解决的重大更改:
- 更新enzyme到React 18兼容版本
- 替换弃用的生命周期方法
- 修复依赖于同步渲染的测试

所有测试通过,无视觉回归检测。

引用: #789

🤖 由 [Claude Code](https://claude.com/claude-code) 生成

合作作者: Claude <noreply@anthropic.com>

结论

精心编写的提交消息是对项目未来的投资。它们作为文档,帮助调试,促进代码审查,并讲述软件如何演变的故事。通过遵循这些指南并使周到的提交消息成为习惯,您将创建一个有价值、可搜索且可维护的git历史。

记住: 您的提交消息是伴随代码永久的文档。让它们有意义。