Conventional commits

Conventional Commits, o Commits Convencionales, es un patrón de uso de repositorios Git en el que ponemos siempre un prefijo a todos los commits para indicar de qué tipo son, por ejemplo feat para las funciones nuevas, fix para los arreglos, o chore para indicar mejoras higiénicas en el repositorio. La spec completa está en https://www.conventionalcommits.org.

Cuando programamos, comunicar lo que hacemos a través de los mensajes de commit puede ser un verdadero desafío. No solo se trata de escribir código, sino también de transmitir claramente a nuestros compañeros, clientes o usuarios qué cambios hemos realizado y por qué. Aquí es donde entran en juego los convencional commits, una especificación que nos ayuda a estandarizar esos mensajes para que sean claros, uniformes y útiles.

La idea principal de los convencional commits es que cada mensaje de commit comience con una palabra clave que indique el tipo de cambio realizado. Por ejemplo, si estamos arreglando un error, el commit debe empezar con fix. Si añadimos una nueva funcionalidad, usaremos feat. Cuando simplemente reorganizamos o limpiamos el código sin añadir ni arreglar nada, el prefijo será refactor. También existen otros tipos como test para cambios relacionados con pruebas, docs para documentación, build para tareas de compilación, o chore para tareas de mantenimiento que no afectan directamente al código funcional.

Esta estructura nos permite, con solo echar un vistazo al historial de commits, entender rápidamente qué ha cambiado en el proyecto. Por ejemplo, en repositorios grandes como Angular o Nuxt.js, podemos ver cómo se repiten estos prefijos al inicio de cada mensaje, lo que facilita la navegación y revisión del código.

Además, en proyectos con múltiples módulos o directorios, podemos añadir un scope para especificar en qué parte del proyecto se ha hecho el cambio. Por ejemplo, un commit podría comenzar con feat(router): para indicar que la nueva funcionalidad está relacionada con el módulo de enrutamiento. Esto es especialmente útil en repositorios grandes donde los cambios pueden afectar áreas muy específicas.

Después del tipo y el scope, escribimos dos puntos y una breve descripción del cambio. Por ejemplo:

feat(auth): añadir soporte para autenticación con OAuth

Otra característica importante de los convencional commits es la forma de indicar cambios que rompen la compatibilidad, conocidos como breaking changes. Estos son cambios que pueden hacer que el código que dependía de versiones anteriores deje de funcionar correctamente. Para señalarlos, podemos usar un footer en mayúsculas con la etiqueta BREAKING CHANGE, explicando qué se ha modificado y cómo afecta a los usuarios. También es posible indicar un breaking change directamente en el tipo de commit añadiendo una exclamación, como en refactor!, para avisar que ese refactor rompe compatibilidad.

Por ejemplo, si cambiamos el tipo de datos que acepta una función, pasando de números a big integers, esto puede romper el código que la usaba antes. En ese caso, el commit podría verse así:

feat!: cambiar tipo de datos de la función calculadora a BigInt

BREAKING CHANGE: la función ahora acepta BigInt en lugar de Number, lo que puede romper código existente.

El footer también puede usarse para añadir metadatos, como referencias a issues o personas responsables de revisar el cambio. Esto ayuda a mantener un registro claro y organizado de por qué se hicieron ciertos commits y quién debe supervisarlos.

Una de las grandes ventajas de usar convencional commits es que podemos automatizar la generación de notas de versión o changelogs. Herramientas como Standard Version leen el historial de commits, identifican los tipos de cambios según sus prefijos y generan automáticamente un archivo que resume qué se ha añadido, arreglado o modificado en cada versión. Esto facilita mucho la tarea de mantener a los usuarios informados sobre las novedades y correcciones en cada actualización.

En definitiva, adoptar convencional commits nos ayuda a mantener un lenguaje común en nuestros proyectos, mejora la comunicación entre todos los involucrados y permite aprovechar herramientas que automatizan procesos importantes como la creación de changelogs. Aunque pueda parecer una moda más, es una moda con un propósito claro y beneficioso para cualquier equipo de desarrollo.

Lista de reproducción
  1. 1
    ¿Qué es Git?
    4 minutos
  2. 2
    Cómo instalar Git
    9 minutos
  3. 3
    Creando tu primer commit
    9 minutos
  4. 4
    Qué es el staging area
    10 minutos
  5. 5
    Cómo deshacer modificaciones de archivos
    7 minutos
  6. 6
    Cómo deshacer un commit con reset
    7 minutos
  7. 7
    Cómo revertir un commit con revert
    7 minutos
  8. 8
    Introducción a las ramas
    6 minutos
  9. 9
    Cómo crear y modificar ramas
    6 minutos
  10. 10
    Commits bajo el workflow Feature Branch
    6 minutos
  11. 11
    Cómo fusionar ramas con merge
    6 minutos
  12. 12
    Fusiones conflictivas
    9 minutos
  13. 13
    Cómo construir alias
    7 minutos
  14. 14
    Más sobre conflictos
    9 minutos
  15. 15
    Etiquetas
    7 minutos
  16. 16
    Tags anotados
    9 minutos
  17. 17
    git stash: esconder cambios
    6 minutos
  18. 18
    Introducción a remotos
    5 minutos
  19. 19
    Pusheando a un remoto
    6 minutos
  20. 20
    Clonando y haciendo pull
    6 minutos
  21. 21
    Fetch y pull rebases
    8 minutos
  22. 22
    Rebase
    7 minutos
  23. 23
    Rebase interactivo
    6 minutos
  24. 24
    Master, main y otros nombres de rama
    9 minutos
  25. 25
    git switch
    9 minutos
  26. 26
    git-restore
    10 minutos
  27. 27
    git-grep
    11 minutos
  28. 28
    Gitignore
    11 minutos
  29. 29
    El flag --patch
    9 minutos
  30. 30
    git-apply y parches en bruto (advanced)
    9 minutos
  31. 31
    Merge octopus (advanced)
    9 minutos
  32. 32
    Conventional commits
    12 minutos
  33. 33
    Merge and squash (GitLab / GitHub...)
    6 minutos
  34. 34
    git merge --squash
    7 minutos
  35. 35
    git-bisect
    8 minutos
  36. 36
    git-blame
    6 minutos
  37. 37
    git-reflog
    10 minutos
  38. 38
    Git para la Bash
    11 minutos
  39. 39
    Submódulos (parte 1)
    7 minutos
  40. 40
    Submódulos (parte 2)
    10 minutos
  41. 41
    Otros clientes Git (último episodio)
    9 minutos