Nov 29

git flow

git-flow

( Imagen de Our Workflow: git-flow

Hace poco, viendo un vídeo, descubrí git-flow.

Siempre había oído, tanto en git como en subversion, que hay que tener una rama de desarrollo, una rama para versiones estables, hacer ramas para cada nueva funcionalidad que se va a implementar, etc, etc. Pero siempre me ha parecido muy lioso. Los comandos de crear ramas y juntarlas tanto en subversion como en git, si bien no son especialmente complicados, si son varios comandos a ejecutar para cada una de esas tareas a hacer y requieren que todos los del equipo seamos muy rigurosos para hacerlo bien.

Pues bien, hay una herramienta para git, llamada git-flow, que justamente nos facilita la ejecución de esos comandos, haciendo que el proceso de crear las ramas para cada nueva funcionalidad, para cada nueva release, para corregir bugs, sea bastante más sencilla.

Con git-flow hay dos ramas principalmente. La rama master, en la que están las versiones estables de nuestro software, convenientemente etiquetadas, y la rama development, en la que se hace el desarrollo. La creación de estas ramas es muy sencilla una vez instalado git-flow, basta ejecutar

$ git flow init

Si queremos empezar a trabajar en una nueva funcionalidad, debemos crear una rama para ella que parte de la rama development. Nuevamente, con git-flow es inmediato

$ git flow feature start NOMBRE

donde NOMBRE es el nombre que queramos para la rama. Yo suelo poner el número de tarea de jira. El comando de git-flow crea la rama feature/NOMBRE y nos hace el checkout de ella para que podamos empezar a trabajar. Podemos subirla al servidor si queremos que más desarrolladores trabajen en ella, o dejarla en nuestro git local si sólo vamos a trabajar nosotros. Una vez terminada y probada la funcionalidad, hay que llevarla a la rama development, que se hace con el siguiente comando

$ git flow feature finish NOMBRE

Esto hace el merge de nuestra funcionalidad sobre la rama de desarrollo … y borra la rama de la funcionalidad, es decir, se borra la rama feature/NOMBRE, aunque los commit que hicimos en ella se han pasado a la rama de desarrollo.

Si quisieramos hacer una nueva entrega de nuestro software, es decir, pasar una nueva versión de la rama de desarrollo a la rama estable master, el comando de git-flow es

$ git flow release start VERSION

Esto crea una nueva rama release/VERSION donde podemos tener congelada este nuevo candidato a versión, hacer los cambios que consideremos necesarios para pasar a nueva versión (por ejemplo, cambiar en número de versión en los ficheros pom.xml o build.gradle, cambiar niveles de log, ficheros de configuración o lo que sea). Una vez que nuestra nueva versión está "fetén", para llevarla a la rama master el comando es

$ git flow release finish VERSION

Esto lleva los cambios de release/VERSION tanto a la rama master como a la rama de desarrollo. Etiqueta la rama master con una etiqueta que nos pide y que puede ser en número de versión o lo que queramos. Y finalmente, borra la rama release/VERSION.

Finalmente, si en la rama estable master encontráramos un bug que hubiera que corregir, git flow permite crear una rama directamente sobre la master para corregir el bug. El comando sería

$ git flow hotfix start BUG

Esto crea una rama hotfix/BUG para que corrijamos el bug. Una vez corregido, hay que llevar los cambios a master y suele ser buena idea llevarlos también a la rama de desarrollo, para que el bug quede corregido definitivamente. El comando es

$ git flow hotfix finish BUG

Esto lleva los cambios del bug tanto a master como a development, y borra la rama del bug.

Y esto es lo básico, bastante sencillo. Hay más comandos de git flow, y con opciones, pero con lo comentado aquí, así de sencillo, se tiene ya un flujo de trabajo sobre git bastante completito.

 

Entradas relacionadas:

Leave a Reply