14 de mayo de 20253 min de lectura

Conventional Commits: cómo escribir mensajes de commit claros, útiles y automatizables

Compartir
Ejemplo visual de Conventional Commits con mensajes estructurados y ramas en Git. Título: Cómo escribir mensajes de commit claros y útiles por Efeele

Tener una convención para los mensajes de commit hace que el historial del proyecto se lea mucho mejor, y además permite automatizar cosas como el changelog, el control de versiones o los despliegues. Aquí va la especificación Conventional Commits 1.0.0, traducida y explicada para que puedas usarla desde ya.

Estructura del mensaje

<tipo>[opcional ámbito]: <descripción>

[opcional cuerpo del mensaje]

[opcional pie de mensaje (footer)]

Ejemplos

feat: agregar búsqueda por filtros
fix: corregir error de validación en formulario
feat(api)!: eliminar soporte para v1
docs: actualizar sección de instalación en README

Tipos principales

  • feat: se agrega una funcionalidad nueva (versión minor en SemVer).
  • fix: se corrige un bug (versión patch en SemVer).
  • BREAKING CHANGE: cambios que rompen la compatibilidad (versión major en SemVer).

Puedes indicar un cambio importante con:

  • Un pie de mensaje: BREAKING CHANGE: ahora se requiere Node 18
  • O un signo ! tras el tipo o ámbito: feat!: eliminar soporte legacy

Otros tipos habituales

Basados en la convención Angular:

  • build: Cambios en la configuración de build o herramientas externas.
  • ci: Cambios en la integración continua.
  • docs: Documentación solamente.
  • style: Formato, espacios, puntos y coma, etc. (sin cambios en lógica).
  • refactor: Refactorización sin cambio de funcionalidad.
  • perf: Mejoras de rendimiento.
  • test: Agrega o corrige tests.
  • chore: Tareas menores sin impacto funcional (por ejemplo, actualización de dependencias).
  • revert: Reversión de un commit anterior.

Reglas de estilo

  • Escribe en imperativo o infinitivo: add, fix, remove, o en español agregar, corregir, eliminar.
  • No pongas punto final en el título.
  • Mantén el título breve, de 50 caracteres como mucho.
  • Si hace falta más contexto, ponlo en el cuerpo.
  • Usa ámbitos cuando ayuden a aclarar: feat(api), fix(auth), etc.

Para qué sirve

Además de un historial más fácil de leer, la convención permite que las herramientas trabajen por ti: changelogs automáticos con conventional-changelog, versiones y publicaciones con semantic-release y validación de los mensajes con commitlint. Cómo montar todo eso lo cuento en Del commit al changelog.

Herramientas

commitlint

Valida que los commits cumplan la convención.

npm install --save-dev @commitlint/cli @commitlint/config-conventional
echo 'npx --no -- commitlint --edit $1' > .husky/commit-msg

Commitizen

Asistente interactivo para escribir commits con la convención correcta.

npm install -g commitizen
npx commitizen init cz-conventional-changelog --save-dev --save-exact

Husky

Ejecuta scripts antes de commits/pushes (por ejemplo, para validar o testear).

npm install --save-dev husky
npx husky init

husky init crea la carpeta .husky/ y añade el script prepare al package.json, así que conviene ejecutarlo antes de configurar commitlint.

Preguntas frecuentes

¿Qué pasa si uso un tipo incorrecto?

  • Si todavía no lo has subido, puedes usar git rebase -i y editar el mensaje.
  • Si ya lo subiste, no pasa nada grave: solo pierdes algo de automatización, como que ese cambio no salga en el changelog.

¿Puedo inventar mis propios tipos?

Sí, pero solo feat, fix y BREAKING CHANGE afectan directamente la gestión semántica de versiones. Los demás son personalizables.

¿Todos deben seguir esta convención?

No necesariamente. Si usas pull requests con squash & merge, puedes ajustar el mensaje final en el merge sin cargar al resto del equipo.


Libros en español sobre Git y GitHub que recomiendo

Recursos

Compartir