2017-04-08 20:57:18 +02:00
---
2018-09-13 22:36:30 +02:00
draft: false
2017-04-08 20:57:18 +02:00
---
2018-05-15 04:19:26 +02:00
# Commits Convencionales 1.0.0-beta.2
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
## Resumen
2017-04-08 20:57:18 +02:00
2018-10-18 22:08:36 +02:00
Como mantenedor de proyectos de código abierto, cuando se incorporan ramas con nuevas
2018-05-15 04:19:26 +02:00
características en `master` al escribir un mensaje de commit estandarizado, el
mensaje del commit debe estar estructurado de la siguiente forma:
2017-04-08 20:57:18 +02:00
---
```
2018-05-15 04:19:26 +02:00
< tipo > [ámbito opcional]: < descripción >
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
[cuerpo opcional]
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
[nota de pie opcional]
2017-04-08 20:57:18 +02:00
```
2018-05-15 04:19:26 +02:00
2017-04-08 20:57:18 +02:00
---
< br / >
2018-05-15 04:19:26 +02:00
El commit contiene los siguientes elementos estructurales para comunicar la
intención al consumidor de la librería:
2018-09-13 22:36:30 +02:00
1. **fix:** un commit de _tipo_ `fix` corrige un error en la base del código
2018-05-15 04:19:26 +02:00
(se correlaciona con [`PATCH` ](http://semver.org/#summary ) en el versionado
semántico).
2018-09-13 22:36:30 +02:00
1. **feat:** un commit de _tipo_ `feat` introduce nuevas características en la
2018-05-15 04:19:26 +02:00
base del código (se correlaciona con [`MINOR` ](http://semver.org/#summary )
en el versionado semántico).
2018-09-13 22:36:30 +02:00
1. **BREAKING CHANGE:** un commit que contiene el texto `BREAKING CHANGE:` al
2018-05-15 04:19:26 +02:00
inicio de su cuerpo opcional o la sección de nota de pie introduce un cambio
en el uso de la API (se correlaciona con [`MAJOR` ](http://semver.org/#summary )
en el versionado semántico). Un cambio en el uso de la API puede ser parte
de commits de _tipo_ . e.g., a `fix:` , `feat:` & `chore:` todos tipos
válidos, adicional a cualquier otro _tipo_ .
2018-09-13 22:36:30 +02:00
1. Otros: _tipos_ de commits distintos a `fix:` y `feat:` están permitidos, por
2018-05-15 04:19:26 +02:00
ejemplo [commitlint-config-conventional ](https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional )
2018-05-31 18:41:38 +02:00
(basado en [the Angular convention ](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines ))
2018-05-15 04:19:26 +02:00
recomienda `chore:` , `docs:` , `style:` , `refactor:` , `perf:` , `test:` y
otros. También recomendamos `improvement` para commits que mejorar una
implementación actual sin añadir nuevas características ni corregir errores.
Tenga presente que estos tipos no son impuestos por la especificación de
commits convencionales y no tienen efecto implícito en el versionado
semántico (a menos que incluyan el texto BREAKING CHANGE, lo cual NO es
recomendado).
< br / >
Se puede agregar un ámbito al _tipo_ de commit para proveer información
contextual adicional y se escribe entre paréntesis, e.g., `feat(parser): add ability to parse arrays` .
## Ejemplos
### Mensaje de commit con descripción y cambio en el uso de la API en el cuerpo
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
```
feat: allow provided config object to extend other configs
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
```
### Mensaje de commit sin cuerpo
```
docs: correct spelling of CHANGELOG
```
### Mensaje de commit con ámbito
```
feat(lang): added polish language
```
### Mensaje de commit para una corrección usando un número de problema (opcional)
```
fix: minor typos in code
see the issue for details on the typos fixed
fixes issue #12
```
## Introducción
En el desarrollo de software, ha sido mi experiencia que los errores en el
código son introducidos con más frecuencia en las fronteras de la aplicación.
Los tests unitarios funcionan muy bien para probar las interacciones que el
mantenedor conoce, pero hacen un mal trabajo capturando la manera interesante,
a veces inesperada, en que una comunidad usa una librería.
Cualquiera que haya actualizado una versión corregida de una dependencia para
luego darse cuenta de que la aplicación empieza a arrojar un flujo de 500
errores, sabe lo importante que es un historial de commits legible (e
[idealmente un bien mantenido CHANGELOG ](http://keepachangelog.com/en/0.3.0/ ))
para el consiguiente proceso forense.
La especificación de Commits Convencionales propone introducir una convención
estandarizada y ligera sobre los mensajes de los commits. Esta convención encaja
con [SemVer ](http://semver.org ), pidiéndole a los desarrolladores de software
describir en los mensajes de los commits, las características, correcciones y
cambios que rompen el uso de la API que hagan.
Al introducir esta convención, creamos un lenguaje común que permite depurar más
fácilmente los problemas a través de las fronteras de un proyecto.
2018-09-13 22:36:30 +02:00
## Especificación
2018-05-15 04:19:26 +02:00
Las palabras “DEBE” (“MUST”), “NO DEBE” (“MUST NOT”), “REQUIERE” (“REQUIRED”),
“DEBERÁ” (“SHALL”), “NO DEBERÁ” (“SHALL NOT”), “DEBERÍA” (“SHOULD”),
“NO DEBERÍA” (“SHOULD NOT”), “RECOMIENDA” (“RECOMMENDED”), “PUEDE” (“MAY”) Y
“OPCIONAL” (“OPTIONAL”) en este documento se deben interpretar como se describe
en [RFC 2119 ](https://www.ietf.org/rfc/rfc2119.txt ).
2018-10-18 22:08:36 +02:00
1. Los commits DEBEN iniciarse con un tipo que consiste en un sustantivo `feat` , `fix` , etc., seguido de dos puntos y un espacio.
2018-09-13 22:36:30 +02:00
1. El tipo `feat` DEBE ser usado cuando un commit agrega una nueva
2018-05-15 04:19:26 +02:00
característica a la aplicación o librería.
2018-09-13 22:36:30 +02:00
1. El tipo `fix` DEBE ser usado cuando el commit representa una corrección a un
2018-05-15 04:19:26 +02:00
error en el código de la aplicación.
2018-09-13 22:36:30 +02:00
1. Se PUEDE añadir un ámbito opcional después del tipo. El ámbito es una frase
2018-05-15 04:19:26 +02:00
que describe una sección de la base del código encerrada en paréntesis,
e.g., `fix(parser):`
2018-09-13 22:36:30 +02:00
1. Una descripción DEBE ir inmediatamente después del tipo/ámbito inicial y es
2018-05-15 04:19:26 +02:00
una descripción corta de los cambios realizados en el código, e.g.,
_fix: array parsing issue when multiple spaces were contained in string._
2018-09-13 22:36:30 +02:00
1. Un cuerpo del commit más extenso PUEDE agregarse después de la descripción,
2018-05-15 04:19:26 +02:00
dando información contextual adicional acerca de los cambios en el código.
El cuerpo DEBE iniciar con una línea en blanco después de la descripción.
2018-09-13 22:36:30 +02:00
1. Una nota de pie PUEDE agregarse tras una línea en blanco después del
2018-05-15 04:19:26 +02:00
cuerpo o después de la descripción en caso de que no se haya dado un cuerpo.
La nota de pie DEBE contener referencias adicionales a los números de
problemas registrados sobre el cambio del código (como el número de problema
que corrige, e.g.,`Fixes #13 `).
2018-09-13 22:36:30 +02:00
1. Los cambios que rompen la API DEBEN ser indicados al inicio de la nota de
2018-05-15 04:19:26 +02:00
pie o el cuerpo del commit. Un cambio que rompe la API DEBE contener el
texto en mayúsculas `BREAKING CHANGE` , seguido de dos puntos y espacio.
2018-09-13 22:36:30 +02:00
1. Una descripción se DEBE proveer después de `BREAKING CHANGE:` , describiendo
2018-05-15 04:19:26 +02:00
qué ha cambiado en la API, e.g., _BREAKING CHANGE: environment variables now take precedence over config files._
2018-09-13 22:36:30 +02:00
1. La nota de pie DEBE contener solamente el texto `BREAKING CHANGE` , vínculos
2018-05-15 04:19:26 +02:00
externos, referencias a problemas u otra metainformación.
2018-09-13 22:36:30 +02:00
1. Otros tipos distintos a `feat` y `fix` PUEDEN ser usados en los mensajes de
2018-05-15 04:19:26 +02:00
los commits.
## ¿Por qué usar Commits Convencionales?
* Generación automática de CHANGELOGs.
* Determinación automática de los cambios de versión (basado en los tipos de
commits).
* Comunicar la naturaleza de los cambios a los demás integrantes del equipo, el
público o cualquier otro interesado.
* Ejecutar procesos de ejecución y publicación.
* Hacer más fácil a otras personas contribuir al proyecto, permitiendo explorar
una historia de los commits más estructurada.
2017-04-08 20:57:18 +02:00
## FAQ
2018-05-15 04:19:26 +02:00
### ¿Cómo puedo trabajar con los mensajes de los commits en la etapa inicial de desarrollo?
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
Recomendamos trabajar como si ya hubiera lanzado su producto. Típicamente
_alguien_, incluso si son sus compañeros desarrolladores, están usando su
2018-10-18 22:08:36 +02:00
producto. Ellos querrán saber qué se ha arreglado, qué se ha dañado, etc.
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
### ¿Qué debo hacer si un commit encaja en más de un tipo de commit?
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
Regrese y haga múltiples commits de ser posible. Parte de los beneficios de los
Commits Convencionales es la habilidad para hacer commits más organizados y así
mismo PRs.
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
### ¿No desalienta esto el desarrollo y la iteración rápida?
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
Desalienta moverse rápido de una forma desorganizada. Ayuda a moverse rápido a
largo plazo a través de proyectos con una gran variedad de contribuidores.
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
### ¿Pueden los Commits Convencionales llevar a los desarrolladores a limitar el tipo de commits que hacen ya que estarán pensando en los tipos previstos?
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
Los Commits Convencionales nos animan a hacer más de cierto tipo de commits como
_fixes_. Adicionalmente, la flexibilidad de los Commits Convencionales permite
a su equipo generar sus propios tipos y cambiarlos a lo largo del tiempo.
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
### ¿Cómo se relaciona esto con SemVer?
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
El tipo de commit `fix` se traduce a un cambio de versión `PATCH` . El tipo de
commit `feat` se traduce a un cambio de versión `MINOR` . Commits con el texto
`BREAKING CHANGE` , sin importar su tipo, se traducen a un cambio de versión
`MAJOR` .
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
### ¿Cómo puedo versionar mis extensiones a la especificación de Commits Convencionales, e.g. `@jameswomack/conventional-commit-spec`?
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
Recomendamos usar SemVer para liberar su propia extensión a esta especificación
(¡y lo animamos a hacer esta extensión!)
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
### ¿Qué debo hacer si por accidente uso un tipo de commit equivocado?
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
#### Cuando utiliza un tipo que es de la especificación pero no es el correcto, e.g. `fix` en lugar de `feat`
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
Antes de combinar o liberar el error, recomendamos usar `git rebase -i` para
2018-10-18 22:08:36 +02:00
editar el historial de los commits. Después de que se ha liberado, la limpieza
2018-05-15 04:19:26 +02:00
será distinta de acuerdo con las herramientas y procesos que usted use.
2017-04-08 20:57:18 +02:00
2018-10-18 22:08:36 +02:00
#### Cuando se usa un tipo que no está en la especificación, e.g. `feet` instead of `feat`
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
En el peor de los escenarios, no es el fin del mundo si aparece un commit que no
cumple con las especificaciones de los commits convencionales. Simplemente, el
commit será ignorado por las herramientas que se basen en esta especificación.
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
### ¿Deben todos los que contribuyen a mi proyecto usar esta especificación?
2017-04-08 20:57:18 +02:00
2018-05-15 04:19:26 +02:00
¡No! Si usa un flujo de trabajo basado en `squash` los líderes del proyecto
pueden limpiar el mensaje en el momento en que se incorpora, sin agregar cargas
adicionales a quienes contribuyen casualmente. Un flujo de trabajo común para
esto es configurar su sistema de git para que haga el `squash` de manera
automática de un pull request y presente al líder del proyecto un formulario
para que ingrese el mensaje de commit correcto al momento de hacer el merge.