git-commit

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Skill: Git Commit con Conventional Commits

Skill:基于Conventional Commits的Git Commit

Preparar y ejecutar commits estandarizados según Conventional Commits, inferidos del diff real del repositorio.
Alcance: captura un único cambio lógico con mensaje semántico. No hace push, no toca configuración global de git, no aplica operaciones destructivas. Preguntar lo que no esté claro — no inventar tipo, scope ni descripción.
Formato canónico:
<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

根据Conventional Commits规范准备并执行标准化提交,提交信息从仓库的实际diff中推断得出。
适用范围: 捕获单个逻辑变更并生成语义化消息。不执行push操作,不修改git全局配置,不执行破坏性操作。对不明确的内容进行询问——不要自行编造类型、作用域或描述。
标准格式:
<type>[可选 scope]: <description>

[可选 body]

[可选 footer(s)]

Cómo preguntar al usuario

如何向用户提问

Usar la herramienta de preguntas estructuradas del cliente (opciones tappables). Reglas:
  • Una pregunta por turno; máximo tres en un mismo bloque.
  • Opciones cortas y mutuamente excluyentes (2–4); entrada libre solo si no hay forma de enumerar opciones.
  • No repreguntar lo que ya está en el contexto,
    .agents/MEMORY.md
    , el diff o la propuesta ya mostrada.
  • Una sola tanda al inicio para resolver ambigüedades; excepciones deliberadas por turno: propuesta de commit, commit en rama protegida, archivo sensible detectado.
  • Fallback: prosa con opciones enumeradas (1, 2, 3…) si el cliente no expone la herramienta.

使用客户端的结构化提问工具(可点击选项)。规则:
  • 每次提问一个问题;同一区块最多三个问题。
  • 选项简短且互斥(2–4个);仅当无法枚举选项时才允许自由输入。
  • 不重复询问上下文、
    .agents/MEMORY.md
    、diff或已展示提案中已有的内容。
  • 仅在开始时进行一轮提问以解决歧义;例外情况:提交提案、向受保护分支提交、检测到敏感文件时可逐次询问。
  • 备选方案:如果客户端未提供结构化工具,则使用带编号选项(1、2、3…)的普通文本提问。

Resolución de idioma

语言处理

  1. preferred language
    en
    .agents/MEMORY.md
    (claves legacy
    language:
    ,
    idioma:
    ,
    Project language:
    como fallback).
  2. Idioma del turno del usuario.
  3. Preguntar y persistir en
    .agents/MEMORY.md
    .
Afecta a la parte en lenguaje natural (descripción, body, footers). Tipo y scope permanecen en inglés salvo acuerdo explícito del equipo.

  1. 优先使用
    .agents/MEMORY.md
    中的
    preferred language
    (兼容旧版键值
    language:
    idioma:
    Project language:
    作为备选)。
  2. 使用用户当前对话的语言。
  3. 若未确定则询问用户并将结果存入
    .agents/MEMORY.md
语言设置影响自然语言部分(描述、body、footers)。类型和作用域默认保持英文,除非团队有明确约定。

Selección de flujo

流程选择

CondiciónFlujo
Sin cambios en el repoInformar al usuario y no commitear
Diff cubre un único tema lógicoFlujo: Commit estándar
Diff mezcla temas (docs + feature, fix + refactor, módulos sin relación)Flujo: Múltiples cambios lógicos
git commit
ya falló por un pre-commit hook
Flujo: Recuperación tras fallo de hook

条件流程
仓库无变更告知用户并不执行提交
Diff仅包含单个逻辑主题流程:标准提交
Diff混合多个主题(文档+功能、修复+重构、无关联模块)流程:多逻辑变更
git commit
因pre-commit hook执行失败
流程:Hook失败恢复

Convenciones del mensaje

提交消息规范

  • Tipo y scope: palabras clave en inglés salvo convención explícita del equipo.
  • Descripción: verbo imperativo presente, máximo 72 caracteres, sin punto final, sin mayúscula inicial.
  • Breaking change:
    !
    tras tipo/scope (
    feat!:
    ) o footer
    BREAKING CHANGE: <detalle>
    .
  • Referencias a issues: footer
    Closes #123
    o
    Refs #456
    cuando el usuario aporte el número.
  • 类型和作用域: 默认使用英文关键词,除非团队有明确约定。
  • 描述: 使用现在时祈使动词,最多72个字符,无句点,首字母不大写。
  • 破坏性变更: 在类型/作用域后添加
    !
    (如
    feat!:
    )或使用footer
    BREAKING CHANGE: <详情>
  • Issue引用: 当用户提供编号时,使用footer
    Closes #123
    Refs #456

Tipos de commit

提交类型

TipoPropósito
feat
Nueva funcionalidad
fix
Corrección de bug
docs
Solo documentación
style
Formato/estilo (sin lógica)
refactor
Refactorización (sin feature/fix)
perf
Mejora de rendimiento
test
Añadir o actualizar tests
build
Sistema de build / dependencias
ci
Cambios en CI / configuración
chore
Mantenimiento / miscelánea
revert
Revertir commit

类型用途
feat
新功能
fix
Bug修复
docs
仅文档变更
style
格式/样式调整(无逻辑变更)
refactor
代码重构(无新功能/修复)
perf
性能优化
test
添加或更新测试
build
构建系统/依赖变更
ci
CI配置变更
chore
日常维护/杂项
revert
回滚提交

Inferencia desde el diff

从Diff中推断信息

Aplicar en orden; si nada encaja con confianza, preguntar al usuario.
按顺序执行;若无法确定则询问用户。

Tipo

类型推断

Patrón observadoTipo
Solo
*.md
,
README*
,
docs/**
,
CHANGELOG*
docs
Solo
*.test.*
,
*.spec.*
,
__tests__/**
,
tests/**
test
Solo archivos de CI (
.github/workflows/**
,
.gitlab-ci.*
, etc.)
ci
Solo archivos de build (
Dockerfile
, deps de
package.json
,
pom.xml
, etc.)
build
Solo cambios de formato/espaciado sin lógica modificada
style
Archivos nuevos bajo
src/**
que añaden funcionalidad usable por el cliente
feat
Modificación de lógica existente que corrige un comportamiento descrito como bug
fix
Reestructuración interna sin cambiar comportamiento observable
refactor
Cambios cuyo único objetivo es ejecución más rápida o menor consumo
perf
Reversión de un commit anterior
revert
Configuración, scripts auxiliares, dependencias menores
chore
观测模式类型
仅修改
*.md
README*
docs/**
CHANGELOG*
docs
仅修改
*.test.*
*.spec.*
__tests__/**
tests/**
test
仅修改CI文件(
.github/workflows/**
.gitlab-ci.*
等)
ci
仅修改构建文件(
Dockerfile
package.json
依赖、
pom.xml
等)
build
仅修改格式/空格,无逻辑变更
style
src/**
下新增文件,为用户添加可用功能
feat
修改现有逻辑以修复被描述为Bug的行为
fix
内部重构,不改变可观测行为
refactor
仅以提升执行速度或降低资源消耗为目标的变更
perf
回滚之前的提交
revert
配置、辅助脚本、次要依赖变更
chore

Scope

作用域推断

  1. Todos los archivos bajo un único módulo (
    src/auth/**
    ) → scope = nombre del módulo.
  2. Todos bajo una feature o dominio identificable → scope = nombre de la feature.
  3. Cambio transversal a una capa (
    api
    ,
    db
    ,
    ui
    ,
    config
    ) → scope = nombre de la capa.
  4. Sin scope claro → omitirlo. No inventar genéricos (
    misc
    ,
    update
    ,
    code
    ).
  1. 所有文件属于同一模块(如
    src/auth/**
    )→ 作用域=模块名称。
  2. 所有文件属于可识别的功能或领域 → 作用域=功能名称。
  3. 变更涉及横向层面(
    api
    db
    ui
    config
    )→ 作用域=层面名称。
  4. 无明确作用域 → 省略。不要编造通用名称(如
    misc
    update
    code
    )。

Descripción

描述推断

Verbo imperativo presente (
add
,
fix
,
remove
,
validate
,
prevent
). Indicar qué cambia, no cómo se implementó. Máximo 72 caracteres. Sin punto final. Sin mayúscula inicial.

使用现在时祈使动词(
add
fix
remove
validate
prevent
)。说明变更内容,而非实现方式。最多72个字符。无句点。首字母不大写。

Detección de secretos en el diff

Diff中的敏感信息检测

Ejecutar antes de aceptar el staging:
bash
git diff --staged | grep -nEi 'password[[:space:]]*=|api[_-]?key|secret[[:space:]]*=|token[[:space:]]*=|BEGIN (RSA |EC |OPENSSH |DSA )?PRIVATE KEY|aws_access_key_id|aws_secret_access_key|-----BEGIN CERTIFICATE-----'
Si hay coincidencias, o si el staging incluye
.env*
,
*.pem
,
*.key
,
id_rsa*
,
*.p12
,
*.pfx
: detener y reportar al usuario los archivos y líneas detectadas. No commitear hasta que el usuario los retire (
git restore --staged <ruta>
) o confirme explícitamente que es intencional.

在确认暂存前执行:
bash
git diff --staged | grep -nEi 'password[[:space:]]*=|api[_-]?key|secret[[:space:]]*=|token[[:space:]]*=|BEGIN (RSA |EC |OPENSSH |DSA )?PRIVATE KEY|aws_access_key_id|aws_secret_access_key|-----BEGIN CERTIFICATE-----'
若检测到匹配内容,暂存区包含
.env*
*.pem
*.key
id_rsa*
*.p12
*.pfx
立即停止并向用户报告检测到的文件和行号。在用户移除相关内容(
git restore --staged <路径>
)或明确确认是有意操作前,不执行提交。

Flujo: Commit estándar

流程:标准提交

  1. Inspeccionar estado y diff:
    bash
    git status --porcelain
    git diff --staged   # si hay staging
    git diff            # si no hay staging
    git rev-parse --abbrev-ref HEAD
  2. Ajustar staging: añadir archivos faltantes del cambio (
    git add <ruta>
    ); retirar no relacionados (
    git restore --staged <ruta>
    ).
  3. Inferir tipo, scope y descripción desde el diff.
  4. Decidir body (solo si aporta contexto no obvio) y footer (
    BREAKING CHANGE
    ,
    Closes #N
    ).
  5. Ejecutar Validación antes de ejecutar. Si falla, detener.
  6. Mostrar Propuesta de commit y esperar confirmación.
  7. Ejecutar el commit:
    bash
    # Una línea
    git commit -m "<type>[scope]: <description>"
    
    # Multi-línea
    git commit -m "$(cat <<'EOF'
    <type>[scope]: <description>
    
    <optional body>
    
    <optional footer>
    EOF
    )"
  8. Reportar SHA corto (
    git rev-parse --short HEAD
    ) y mensaje del commit creado.

  1. 检查状态和diff:
    bash
    git status --porcelain
    git diff --staged   # 若有暂存内容
    git diff            # 若无暂存内容
    git rev-parse --abbrev-ref HEAD
  2. 调整暂存区:添加变更中遗漏的文件(
    git add <路径>
    );移除无关文件(
    git restore --staged <路径>
    )。
  3. 从diff中推断类型、作用域和描述。
  4. 决定是否添加body(仅当提供非显而易见的上下文时)和footer(
    BREAKING CHANGE
    Closes #N
    )。
  5. 执行提交前验证。若验证失败则停止。
  6. 展示提交提案并等待用户确认。
  7. 执行提交:
    bash
    # 单行消息
    git commit -m "<type>[scope]: <description>"
    
    # 多行消息
    git commit -m "$(cat <<'EOF'
    <type>[scope]: <description>
    
    <optional body>
    
    <optional footer>
    EOF
    )"
  8. 报告提交的短SHA(
    git rev-parse --short HEAD
    )和提交消息。

Flujo: Múltiples cambios lógicos

流程:多逻辑变更

  1. Agrupar archivos por afinidad desde el diff (área, tipo de cambio, intención).
  2. Proponer al usuario la lista ordenada de commits planeados: tipo/scope, archivos, descripción tentativa.
  3. Esperar confirmación o ajustes antes de tocar staging.
  4. Por cada grupo confirmado, en orden:
    1. git reset
      (preserva el working tree) para vaciar staging.
    2. git add <archivos>
      del grupo.
    3. Ejecutar Validación antes de ejecutar.
    4. Mostrar Propuesta de commit y esperar confirmación.
    5. git commit -m "..."
      y registrar el SHA.
  5. Reportar la secuencia final de SHAs y mensajes en el orden ejecutado.

  1. 根据diff将文件按关联性分组(领域、变更类型、意图)。
  2. 向用户展示计划的提交列表:类型/作用域、文件、暂定描述。
  3. 在修改暂存区前等待用户确认或调整。
  4. 对每个确认的分组,按顺序执行:
    1. 执行
      git reset
      (保留工作区文件)清空暂存区。
    2. 执行
      git add <文件>
      添加当前分组的文件。
    3. 执行提交前验证
    4. 展示提交提案并等待用户确认。
    5. 执行
      git commit -m "..."
      并记录SHA。
  5. 按执行顺序报告最终的SHA序列和提交消息。

Flujo: Recuperación tras fallo de hook

流程:Hook失败恢复

  1. Leer el mensaje del hook; aplicar las correcciones en el working tree.
  2. Re-stagear los archivos corregidos:
    git add <archivos>
    .
  3. Crear un commit nuevo con el mismo mensaje acordado — no
    --amend
    salvo petición explícita.
  4. No usar
    --no-verify
    salvo petición explícita.
  5. Si el problema es del propio hook (config rota, no del código): informar al usuario y esperar instrucciones.

  1. 读取Hook错误消息;在工作区中应用修正。
  2. 重新暂存修正后的文件:
    git add <文件>
  3. 使用之前约定的消息创建新提交——除非用户明确要求,否则不使用
    --amend
  4. 除非用户明确要求,否则不使用
    --no-verify
  5. 若问题源于Hook本身(配置错误,而非代码问题):告知用户并等待指示。

Propuesta de commit

提交提案

Mostrar antes de ejecutar
git commit
y esperar confirmación mediante la herramienta de preguntas estructuradas:
Propuesta:
  tipo:        <type>
  scope:       <scope o "(omitido)">
  descripción: <description>
  archivos:
    - <archivo 1>
    - <archivo 2>
  body:        <texto o "(ninguno)">
  footer:      <texto o "(ninguno)">
Opciones:
Confirmar
/
Ajustar tipo
/
Ajustar scope
/
Ajustar descripción
/
Cancelar
. Si el usuario ajusta, aplicar y volver a mostrar la propuesta.

在执行
git commit
前展示提案,并通过结构化提问工具等待用户确认:
提案:
  类型:        <type>
  作用域:       <scope 或 "(省略)">
  描述: <description>
  文件:
    - <文件1>
    - <文件2>
  Body:        <文本或 "(无)">
  Footer:      <文本或 "(无)">
选项:
确认
/
调整类型
/
调整作用域
/
调整描述
/
取消
。若用户调整,应用修改后重新展示提案。

Validación antes de ejecutar

提交前验证

  • Sin secretos en staging (ejecutar Detección de secretos).
  • Un solo cambio lógico por commit.
  • Sin
    --force
    ,
    --hard
    ,
    --no-verify
    ,
    --amend
    salvo petición explícita.
  • Rama segura, o usuario confirmó commit directo en
    main
    /
    master
    /
    develop
    /
    release/*
    .
Si hay conflicto:
⚠️ No es posible commitear todavía:
- <razón concreta>
- <archivo, línea o detalle>

  • 暂存区无敏感信息(执行敏感信息检测)。
  • 每个提交仅包含单个逻辑变更。
  • 除非用户明确要求,否则不使用
    --force
    --hard
    --no-verify
    --amend
  • 分支安全,或用户已确认直接向
    main
    /
    master
    /
    develop
    /
    release/*
    提交。
若存在冲突:
⚠️ 无法执行提交:
- <具体原因>
- <文件、行号或详情>

Checklist antes de ejecutar
git commit

执行
git commit
前检查清单

Información:
  • git status
    y
    git diff
    revisados completos
  • Tipo, scope y descripción derivados del diff, no inventados
  • Rama actual conocida
  • Idioma de preferencia determinado
  • Intención clara: un commit único vs. separación en varios
Validación:
  • Detección de secretos ejecutada sin coincidencias
  • Un solo cambio lógico por commit
  • Sin
    --force
    ,
    --hard
    ,
    --no-verify
    ,
    --amend
    salvo petición explícita
  • Rama segura o usuario confirmó
Formato:
  • Primera línea
    <type>[scope]: <description>
    válida
  • Descripción: imperativo presente, máximo 72 chars, sin punto, sin mayúscula inicial
  • Body separado por línea en blanco si existe
  • Breaking change marcado correctamente si aplica
  • Referencia a issue si el usuario la aportó
Confirmación:
  • Propuesta mostrada y confirmación recibida

信息确认:
  • 已完整查看
    git status
    git diff
  • 类型、作用域和描述均来自diff,未自行编造
  • 已知当前分支
  • 已确定偏好语言
  • 意图明确:单个提交 vs 拆分为多个提交
验证项:
  • 已执行敏感信息检测且无匹配结果
  • 每个提交仅包含单个逻辑变更
  • 除非用户明确要求,否则未使用
    --force
    --hard
    --no-verify
    --amend
  • 分支安全或用户已确认提交
格式检查:
  • 首行
    <type>[scope]: <description>
    格式有效
  • 描述:使用现在时祈使动词,最多72字符,无句点,首字母不大写
  • 若存在Body,已用空行分隔
  • 若为破坏性变更,已正确标记
  • 若用户提供Issue编号,已正确引用
确认环节:
  • 已展示提案并收到用户确认

Ejemplos

示例

Ejemplo 1 — Commit estándar
  • Entrada: «Acabo de corregir el bug del cupón vacío en el checkout; diff solo en
    src/cart/checkout.ts
  • Salida:
    git commit -m "fix(cart): validate empty coupon before apply"
Ejemplo 2 — Cambios mezclados
  • Entrada: Diff incluye
    README.md
    ,
    docs/api.md
    y
    src/api/users.ts
    con una ruta nueva.
  • Salida: Dos commits:
    docs: update API endpoint reference
    y
    feat(users): add endpoint to fetch user preferences
    .
Ejemplo 3 — Breaking change
  • Entrada: Diff renombra endpoint público
    /v1/users
    /v2/users
    rompiendo clientes existentes.
  • Salida:
    feat(api)!: rename users endpoint to v2
    
    BREAKING CHANGE: `/v1/users` removed; clients must migrate to `/v2/users`.
Ejemplo 4 — Información incompleta
  • Entrada: «Haz commit de lo que está en staging.» Cambios cruzan varios módulos sin patrón claro.
  • Comportamiento: Preguntar la intención principal o proponer agrupación. No generar mensaje genérico.
Ejemplo 5 — Fallo de hook
  • Entrada: Hook de lint falla en
    src/utils.ts
    tras
    git commit
    .
  • Comportamiento: Aplicar el formateo,
    git add src/utils.ts
    , commit nuevo con el mismo mensaje. Sin
    --amend
    ni
    --no-verify
    .
Ejemplo 6 — Secreto detectado
  • Entrada: Diff staged incluye
    config/.env.local
    con
    DB_PASSWORD=hunter2
    .
  • Comportamiento: Detener, reportar archivo y línea. Sugerir
    git restore --staged config/.env.local
    . No commitear sin confirmación explícita.

示例1 — 标准提交
  • 输入: «我刚修复了结账时空优惠券的Bug;diff仅涉及
    src/cart/checkout.ts
    。»
  • 输出:
    git commit -m "fix(cart): validate empty coupon before apply"
示例2 — 混合变更
  • 输入: Diff包含
    README.md
    docs/api.md
    src/api/users.ts
    中的新接口。
  • 输出: 两个提交:
    docs: update API endpoint reference
    feat(users): add endpoint to fetch user preferences
示例3 — 破坏性变更
  • 输入: Diff将公开接口
    /v1/users
    重命名为
    /v2/users
    ,会影响现有客户端。
  • 输出:
    feat(api)!: rename users endpoint to v2
    
    BREAKING CHANGE: `/v1/users`已移除;客户端需迁移至`/v2/users`。
示例4 — 信息不完整
  • 输入: «提交暂存区的内容。» 变更涉及多个无明确关联的模块。
  • 行为: 询问用户主要意图或提议分组方式。不生成通用消息。
示例5 — Hook失败
  • 输入:
    git commit
    后lint Hook在
    src/utils.ts
    执行失败。
  • 行为: 应用格式化修正,执行
    git add src/utils.ts
    ,使用相同消息创建新提交。不使用
    --amend
    --no-verify
示例6 — 检测到敏感信息
  • 输入: 暂存区的Diff包含
    config/.env.local
    中的
    DB_PASSWORD=hunter2
  • 行为: 立即停止,报告文件和行号。建议执行
    git restore --staged config/.env.local
    。无用户明确确认则不提交。

Anti-patterns

反模式

  • Commit que mezcla features, fixes y refactors sin relación.
  • Mensajes vagos (
    update
    ,
    fix stuff
    ,
    changes
    ,
    wip
    ).
  • Inventar tipo o scope cuando el diff no lo respalda.
  • Incluir archivos sensibles (
    .env
    , claves) sin detección y confirmación.
  • Saltar la detección de secretos confiando en inspección visual.
  • Saltar hooks con
    --no-verify
    por comodidad.
  • Usar
    --amend
    tras fallo de hook en lugar de crear un commit nuevo.
  • Force push a
    main
    /
    master
    .
  • Modificar configuración global de git sin permiso explícito.
  • Ejecutar
    git commit
    sin mostrar la propuesta y esperar confirmación.
  • Lanzar preguntas como prosa libre cuando el cliente expone la herramienta estructurada.
  • Narrar el trabajo al usuario — reportar solo SHA, mensaje final y pendientes.
  • 提交混合无关联的功能、修复和重构内容。
  • 使用模糊消息(
    update
    fix stuff
    changes
    wip
    )。
  • 当diff无法支撑时自行编造类型或作用域。
  • 未检测和确认就包含敏感文件(
    .env
    、密钥等)。
  • 跳过敏感信息检测仅依赖人工检查。
  • 为图方便跳过Hook使用
    --no-verify
  • Hook失败后使用
    --amend
    而非创建新提交。
  • main
    /
    master
    执行force push。
  • 无用户明确许可修改git全局配置。
  • 未展示提案并等待确认就执行
    git commit
  • 当客户端提供结构化工具时仍使用自由文本提问。
  • 向用户详述操作过程——仅报告最终SHA、提交消息和待办事项。