Un mensaje de commit bien estructurado es fundamental para mantener la legibilidad del historial de un proyecto. Ejecutar simplemente git commit -m "actualizacion" puede ser rápido, pero carece de contexto para los revisores. Para resolver esto, la comunidad ha adoptado ampliamente la convención de Angular, un sistema estandarizado que facilita la revisión de código, el rastreo de errores y la generación automática de registros de cambios (changelogs).
Un mensaje de commit estructurado se divide en tres bloques principales: el encabezado (Header), el cuerpo (Body) y el pie de página (Footer). Es una regla estricta mantener cada línea por debajo de los 72 o 100 caracteres para evitar cortes automáticos en las terminales.
<tipo>(<alcance>): <asunto>
<cuerpo>
<pie_de_pagina>
El encabezado es el único componente obligatorio. A continuación, se muestra un ejemplo práctico:
fix(auth): implement secure token validation using jwt-decode
The previous implementation relied on a deprecated library for parsing tokens,
which caused expiration checks to fail silently. This change replaces
the parsing logic with jwt-decode to ensure robust validation.
Resolves #892
1. El Encabezado (Header)
El encabezado consta de una sola línea dividida en tres campos: type (obligatorio), scope (opcional) y subject (obligatorio).
Tipo (Type): Define la naturaleza del cambio. Solo se permiten los siguientes identificadores:
- feat: Introducción de una nueva funcionalidad.
- fix: Corrección de un error.
- docs: Modificaciones exclusivas en la documentación.
- style: Ajustes de formato que no alteran la ejecución del código (espacios, comillas, etc.).
- refactor: Reestructuración de código que no añade funciones ni corrige errores.
- test: Adición o corrección de pruebas.
- chore: Actualizaciones en herramientas de compilación o scripts auxiliares.
Los tipos feat y fix garantizan su inclusión automática en los registros de cambios. Los demás se filtran por defecto, salvo que el equipo acuerde lo contrario.
Alcance (Scope): Indica el módulo o capa del sistema afectada por el cambio, como database, router o ui.
Asunto (Subject): Es un resumen conciso del objetivo del commit (máximo 50 caracteres). Las reglas para redactarlo son:
- Iniciar con un verbo en presente.
- Comenzar con letra minúscula.
- Omitir el punto final.
2. El Cuerpo (Body)
Este bloque proporciona una explicación detallada del commit y puede abarcar múltiples líneas. Debe estar separado del encabezado por una línea en blanco.
Se reescribió el controlador de usuarios para utilizar el patrón repositorio.
Esto mejora la separación de responsabilidades y facilita las pruebas unitarias.
El rendimiento en las consultas a la base de datos se incrementó un 15%.
Es crucial detallar la motivación detrás de la modificación y contrastarla con el comportamiento previo. Se recomienda mantener la coherencia gramatical utilizando la primera persona del presente, tal como en el encabezado.
3. El Pie de Página (Footer)
El pie de página se reserva para metadatos críticos, separados del cuerpo por una línea en blanco. Se utiliza principalmente para dos escenarios:
Cambios incompatibles (Breaking Changes): Cuando la actualización rompe la compatibilidad con versionse anteriores, se debe iniciar el bloque con BREAKING CHANGE: seguido de la justificación y los pasos de migración.
BREAKING CHANGE: la configuración de la base de datos ahora requiere variables de entorno.
Antes:
const dbConfig = { host: 'localhost' };
Después:
const dbConfig = { host: process.env.DB_HOST };
Debes crear un archivo .env en el directorio raíz con las credenciales.
Cierre de incidencias (Issues): Si el commit resuelve un ticket o error reportado, se puede vincular su cierre usando palabras clave:
Closes #404
Closes #112, #115, #200
4. Reversiones (Revert)
Al deshacer un commit anterior, el mensaje debe seguir una estructura estricta. El encabezado comienza con revert:, seguido del encabezado exacto del commit original que se está anulando.
revert: feat(payments): integrate stripe sdk
This reverts commit 8a4b2c9e1f5d3a7b9c0e2f4a6b8d1e3f5a7b9c0d.
El cuerpo debe contener literalmente la frase This reverts commit <hash>., donde <hash> es el identificador SHA del commit revertido. En los registros de cambios automatizados, estas reversiones se agrupan bajo una sección dedicada si pertenecen a un ciclo de lanzamiento distinto al del commit original.