Gitflow – Qué es, y como usarlo.

Git, hoy en día es uno de los sistemas de control de versiones más populares, por la flexibilidad de poder trabajar con ramas (branches) y agregar nuevas funcionalidades, sin poner en “peligro” de inconsistencias en nuestro proyecto actual (producción).
Gitflow, es un modelo de flujo de trabajo de Git, con el uso de ramas, que fue publicado por Vincent Driessen en nvie (http://nvie.com/posts/a-successful-git-branching-model/), que nos permite un mejor control de proyectos medianos/grandes.
Este modelo de trabajo, asigna roles específicos a las ramas y define como se debe interactuar entre ellas. Adicional a las ramas de features, que usa el modelo: Feature Branch Workflow (https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow), se usan ramas especializadas para desarrollo, soporte, revisiones y lanzamientos.
Así mismo, existe el  git-flow toolset (https://github.com/nvie/gitflow), el cual se integra con git para permitirnos usar comandos que nos ayuden a automatizar algunas partes del flujo propuesto.

Empezamos!

Gitflow, como se dijo, es un marco de trabajo, es una idea abstracta un flujo de trabajo en Git. Esto significa, que este flujo de trabajo, nos dice que ramos debemos crear, y como se relacionan entre si.
Existen paquetes para git-flow, para el SO que se utilice. Para Windows, viene pre instalado en el paquete instalador de Git (https://git-scm.com/download/win).
Luego de la instalación, se puede usar utilizando el comando git flow init. Este comando no cambia nada, a excepción de que crea ramas predefinidas.

Cómo funciona

Ramas Develop y Master



En lugar de usar una única rama master, que gestiona toda la información del proyecto, este marco utiliza dos ramas. La rama master, almacena los lanzamientos oficiales, etiquetando la versión a la que pertenece. La rama develop (desarrollo) sirve para realizar la integración con las ramas de features (ramas de características particulares a desarrollarse).
El primer paso es crear la rama develop. Esto podría hacerse de manera normal con:


 git branch develop  
 git push origin develop  

Esta rama, es la que tendrá toda la historia del Proyecto. El resto de desarrolladores que colaboren con el proyecto, deben clonar esta rama.
Si se usa la extensión git-flow, al ejecutar git flow init, este crearía la rama develop.


Ramas Features


Cada nueva característica a agregar al proyecto, debe ser creada bajo su propia rama, la cual debe ser enviado al repositorio centra. En este caso en lugar de utilizar la rama master, se debe enviar a la rama develop. Cuando la característica está completa, se debe unir con la rama develop. Nunca una rama de característica debe interactuar directamente con la rama master.

Como empezar una rama de característica.

Sin la extensión git-flow
 git checkout develop  
 git checkout –b nombre_caracteristica  

Con la extensión git-flow:
 git flow feature start nombre_caracteristica  

Como terminar una rama de característica.

Cuando se haya terminado con el desarrollo de la nueva característica del proyecto, el siguiente paso es realizar la migración (merge) con la rama develop.

Sin la extensión git-flow
 git checkout develop  
 git merge nombre_caracteristica  

Con la extensión git-flow:

 git flow feature finish nombre_caracteristica  

Ramas Release


Una vez que la rama develop, haya obtenido las características necesarias para un lanzamiento (release), se necesita bifurcar a una rama release fuera de la rama develop.
Creando esta rama, empieza el siguiente ciclo de lanzamiento, entonces a esta rama, no se le puede agregar nuevas características, solo se deben agregar documentación u otro elemento propio de un lanzamiento.
Una vez listo, la rama reléase es única en la rama master, y etiquetada con su número de versión respectiva.
Usar una rama dedicada para preparar el lanzamiento, hace posible que un equipo especializado lo optimice, mientras que el equipo de desarrollo puede seguir con su trabajo, agregando nuevas características en la rama develop.

Como empezar una rama de lanzamiento.

Sin la extensión git-flow
 git checkout develop  
 git checkout –b release/0.1.0  

Con la extensión git-flow:
 git flow release start 0.1.0  

Como terminar una rama de lanzamiento.

Una vez se haya realizado el lanzamiento, este debe ser unido a la rama master y develop, y la rama release, debe ser eliminada.

Sin la extensión git-flow
 git checkout develop  
 git merge release/0.1.0  
 git checkout master  
 git checkout merge release/0.1.0  

Con la extensión git-flow
 git flow release finish 0.1.0  

Ramas Hotfix


Las ramas de mantenimiento o “hotfix”, son usadar para “parchar” versiones en producción.
Las ramas Hotfix, son las únicas que se bifurcan directamente de la rama master. Tan pronto como la solución o “parche” esta dado, se une a la rama master, con su respectiva etiqueta de versión, y a la vez a la rama develop.  

Como empezar una rama de hotfix.

Sin la extensión git-flow
 git checkout master  
 git checkout –b nombre_parche  

Con la extensión git-flow
 git flow hotfix start nombre_parche  

Como terminar una rama de hotfix.

Una vez se haya realizado el parche, este debe ser unido a la rama master y develop.

Sin la extensión git-flow
 git checkout master  
 git merge nombre_parche   
 git checkout develop  
 git merge nombre_parche  
 git branch –D nombre_parche  

Con la extensión git-flow
 git flow hotfix finish nombre_parche