git-commit · git:20260929.35b3850 · 2026-09-29 · sha256 f761c41a59f360fe

git-commit git:20260929.35b3850A

Immutable. This exact content never changes and is served at /api/v1/blob/f761c41a59f360fe.

---
name: git-commit
description: 使用约定式提交规范执行 git commit。当用户说「帮我提交」「提交一下这些改动」时使用。
license: MIT
allowed-tools: Bash
metadata:
  category: Git 与协作
  tagline: "按约定式提交规范生成提交信息并提交"
  example: "帮我提交"
---

# Git 约定式提交

## 概述

使用约定式提交(Conventional Commits)规范创建标准化、语义化的 git commit。分析实际 diff 来确定合适的 type、scope 和消息。

## 语言设置

**默认生成中文提交消息。** 用户可通过参数指定其他语言,例如:

- 无参数 → 中文消息
- `--lang=en` → 英文消息

## 约定式提交格式

```
<type>[可选 scope]: <描述>

[可选正文]

[可选脚注]
```

### 中文消息示例

```
feat(auth): 引入 JWT 验证以保护接口安全

实现 JWT Token 验证中间件,解决接口未鉴权的安全风险:
- 验证 Token 签名和过期时间,防止伪造请求
- 从 Payload 提取用户声明,供下游使用
- 将用户上下文注入请求对象,避免重复查询
- 处理 Refresh Token 轮换,保持会话连续性
```

### 英文消息示例

```
feat(auth): add JWT validation to secure API endpoints
```

## 提交类型

| 类型       | 用途                         |
| ---------- | ---------------------------- |
| `feat`     | 新功能                       |
| `fix`      | 修复缺陷                     |
| `docs`     | 仅文档变更                   |
| `style`    | 代码格式/风格(不影响逻辑)  |
| `refactor` | 重构(非功能/非修复)        |
| `perf`     | 性能优化                     |
| `test`     | 新增/更新测试                |
| `build`    | 构建系统/依赖变更            |
| `ci`       | CI/配置变更                  |
| `chore`    | 维护/杂项                    |
| `revert`   | 回退提交                     |

## 破坏性变更

```
# type/scope 后加感叹号
feat!: 移除已废弃的接口以简化 API 维护

# BREAKING CHANGE 脚注
feat: 支持配置继承以减少重复配置

BREAKING CHANGE: `extends` 键的行为已变更
```

## 提交拆分策略

当检测到以下情况时,应建议拆分为多个提交:

1. **混合类型**:新功能 + 缺陷修复在同一提交中
2. **多关注点**:不相关的变更混在一起
3. **大范围变更**:跨越多个模块的修改
4. **文件模式混合**:源码 + 测试 + 文档混杂
5. **依赖混杂**:依赖更新与功能代码混合

## 工作流程

### 1. 分析差异

```bash
# 首先检查暂存区
git diff --staged

# 同时检查状态,判断暂存区和工作区情况
git status --porcelain
```

**默认只提交暂存区(staged)的代码。** 流程如下:

1. 先检查暂存区是否有内容(`git diff --staged` 是否有输出)
2. **暂存区有内容** → 直接使用暂存区差异生成提交消息
3. **暂存区无内容** → 提示用户:"暂存区没有文件,是否要提交工作区的变更?" — 等待用户确认后再执行

### 2. 暂存文件(如需要)

仅在用户确认提交工作区变更后,或需要按逻辑分组时暂存:

```bash
# 暂存指定文件
git add path/to/file1 path/to/file2

# 按模式暂存
git add *.test.*
git add src/components/*
```

**绝不能提交密钥文件**(.env、credentials.json、私钥等)。

### 3. 生成提交消息

分析 diff 来确定:

- **Type**:这是什么类型的变更?
- **Scope**:影响哪个区域/模块?
- **描述**:一行概括**为什么要做这个变更**(现在时态、祈使语气、<72 字符),侧重动机而非动作本身

**描述应说明"为什么",而非仅仅"改了什么"。** 好的描述让读者理解变更的意图和背景,而不需要去看 diff。

示例对比:

```
# 不好 — 只说了做了什么
fix: 修改登录接口返回值

# 好 — 说明了为什么改
fix: 登录接口需返回用户角色以支持权限控制
```

```
# 不好 — 只说了做了什么
feat: 添加缓存模块

# 好 — 说明了为什么加
feat: 引入缓存层以降低数据库查询延迟
```

### 4. 执行提交

```bash
# 单行
git commit -m "<type>[scope]: <描述>"

# 多行,含正文/脚注
git commit -m "$(cat <<'EOF'
<type>[scope]: <描述>

<可选正文>

<可选脚注>
EOF
)"
```

### 5. Push 规则

**默认不执行 `git push`。** 只有当用户明确说了"push"或"推送"时,才在提交后执行 push。

## 最佳实践

- 一个提交只包含一个逻辑变更
- 使用现在时态:"添加" 而非 "添加了"
- 使用祈使语气:"修复缺陷" 而非 "修复了缺陷"
- 引用议题:`Closes #123`、`Refs #456`
- 描述保持在 72 字符以内

## Git 安全协议

- 禁止修改 git config
- 未经用户明确要求,禁止执行破坏性命令(--force、hard reset)
- 未经用户要求,禁止跳过钩子(--no-verify)
- 禁止 force push 到 main/master
- 如果提交因钩子失败,修复问题后创建新提交(不要 amend)