¿Tienes git-flow?
Juanma Cabello Colaboraciones 31/03/2017
Git es parte de nuestra vida. El que fuera el sistema de control de versiones que creó Linus Torvalds para desarrollar el kernel Linux de una manera más eficiente con su equipo ha pasado a ser una pieza fundamental en el día a día laboral de muchos de nosotros. Pero, como cualquier herramienta, hay que saber cómo utilizarlo para no desaprovechar su potencial y, en el peor de los casos, que acabe siendo un obstáculo. Una de las genialidades de git es que es extensible por lo que podremos instalar plugins que nos resulten interesantes. En este caso, quisiera hablaros de git-flow.
¿Qué es git-flow?
Vincent Driessen diseñó hace ya algún tiempo un sistema de ramificación eficiente para git con el que mejorar el flujo de trabajo de su equipo de desarrollo al que llamó git-flow. Básicamente, se trata de una extensión para git que automatiza diferentes tareas que se realizan a la hora de crear ramas, publicar cambios, controlar las releases y puestas en producción, así como la resolución de bugs.
Instalación
El proceso de instalación es muy sencillo. Basta con usar Homebrew (o bien linuxbrew si eres amante del gnu):
$ brew install git-flow
Con esto ya tendrás git-flow disponible en tu sistema. Así de sencillo.
Uso
Para poder usarlo, debes inicializar tu repositorio git dónde lo quieras usar. Para ello basta con:
$ git flow init
También es una tarea bastante liviana. Te aparecerá un asistente dónde tendrás que especificar los prefijos para los diferentes tipos de ramas que git-flow manejará por tí.
El planteamiento es bien sencillo: se dispone inicialmente de dos ramas llamadas master y develop donde residirá el código que va a producción y el código sobre el que se desarrolla respectivamente.
Los requerimientos se implementarán en ramas que saldrán desde develop y que tendrán el nombre de feature/<nombre_del_requerimiento>. Para crear una rama de este tipo debemos hacer:
$ git flow feature start <nombre_del_requerimiento>
Automáticamente, git-flow nos creará la rama correspondiente y hará checkout de ella para que podamos trabajar directamente. Si se da el caso de que estamos trabajando con algún compañero en un mismo requerimiento y queremos publicar nuestros cambios para que los tenga accesibles, basta con:
$ git flow feature publish
De esta manera, se creará la rama en origin (en caso de no estar ya creada) y nuestro compañero podrá hacer pull para tener nuestros últimos cambios.
Una vez que hayamos terminado la implementación del requerimiento, debemos cerrar la rama e integrarla en develop:
$ git flow feature finish
Esto no solo cerrará la rama sino que, también, integrará con develop los cambios realizados.
Pasemos a cosas más serias. Si ya tenemos un montón de requerimientos implementados y estamos listos para probar el código que va a ir a producción, debemos crear una rama para esto desde develop que se llamará release/<versión_de_la_release>:
$ git flow release start <versión_de_la_release>
Y ya tendríamos la rama sobre la que hacer pruebas y donde deben corregirse posibles bugs que tengan que ver únicamente con la release (nada de corregir bugs "ya que estamos"). Al igual que con los requerimientos, podemos hacer publish de esta rama para que los demás vean los cambios realizados.
Una vez más, para finalizarla, haríamos:
$ git flow release finish <versión_de_la_release>
Esto integraría con master y con develop la rama para release y nos pedirá etiquetar el estado actual del código con un número de versión.
Por último, pero no menos importante, git-flow también contempla la resolución de bugs en caliente. Para ello debemos ejecutar el siguiente comando:
$ git flow hotfix start <versión_siguiente_de_la_aplicación>
Esto creará una rama desde master en la que deberemos corregir el bug que ha provocado que se caiga producción (¿a quien no le ha pasado alguna vez?) llamada hotfix/<versión_siguiente_de_la_aplicación>. Una vez terminada la correción, haríamos:
$ git flow hotfix finish <versión_siguiente_de_la_aplicación>
La rama se integrará con master y con develop y podremos hacer un deploy rapidísimo para que nuestros usuarios no noten nada.
Ten en cuenta que a la hora de integrar puedes toparte con conflictos debido a que tus compañeros hayan cerrado sus ramas. Te tocará solventarlo antes de poder terminar las integraciones como viene siendo normal.
Conclusión
Genial extensión que no sabrás como pudiste haber vivido sin ella antes una vez que empieces a usarla. Este sistema de ramificación nos permite tener mejor control sobre qué código está en qué rama y nos permite tracear mejor qué código pertenece a qué versión de nuestra aplicación.
Si quieres más información, no dudes en pasarte por el post de Vincent donde explica mucho más detalladamente el funcionamiento de git-flow.
¿Y tu? ¿Ya usaba git-flow? ¿Has tenido algún problema en su uso? ¡Cuéntanos tus experiencias en los comentarios!
Foto: tree por Robert Couse-Baker