Git Flow

Git Branching Model

Git Branches

¿Cómo almacena Git sus datos?

  • Git crea snapshots
  • Cuando se hace un commit, Git almacena un commit object que contiene:
    • Apuntador al snapshot del contenido staged
    • El autor del commit
    • El metadato mensaje
    • Cero o más apuntadores al objeto (u objetos) commit padre de donde viene el presente commit
    • El primer commit no tiene padre.

Git Branches

Directorio con 3 archivos:

$ git add README test.txt gretting.txt
$ git commit -m 'initial commit of my project'

git commit hace un checksum de todos los directorios del proyecto y los almacena como objetos tree en el repositorio Git.

 

Con esto, Git crea un objeto commit que tiene los metadatos y un apuntador al objeto tree raiz del proyecto, de tal forma que este pueda recrear este snapshot cuando sea necesario.

Commit Object

Datos de repositorio de un commit simple

 

Siguientes commits...

Datos de objeto Git para múltiples commits

¿Qué es un Git Branch?

Es un ligero apuntador movible hacia uno de estos commits.

 

El branch por defecto se llama master. Tras los commits, se le indica al branch master que apunte al último commit hecho. Con cada commit, este apuntador (branch master) se mueve automáticamente.

Branch pointing a través de la historia de commits

Creando un nuevo branch

$ git branch testing

Esto crea un nuevo apuntador hacia el mismo commit donde estás (seguimos en master)

Multiples branches apuntando a un commit

HEAD - Un apuntador especial

Es un apuntador al branch local donde se está trabajando

HEAD apunta a master

HEAD pointer

Para moverse a un branch existente, se utiliza el comando:

HEAD apunta a testing

$ git checkout testing

HEAD se mueve para apuntar ahora al branch testing

Commit sobre testing

HEAD se mueve en cada commit

$ vim test.rb

$ git commit -a -m 'made a change'

Regresando a master

HEAD regresa a otro branch en un checkout

$ git checkout master

Un cambio sobre master

La historia de los branches ha cambiado

$ vim test.rb 
$ git commit -a -m 'made other changes'

Git flow

Es una propuesta de branching que ha mostrado ser funcional en proyectos de desarrollo.

Bitbucket

https://confluence.atlassian.com/bitbucketserver/using-branches-in-bitbucket-server-776639968.html

Git flow

Existen dos ramas con tiempo de vida infinito:

 

  • Master
  • Develop

Develop

Qué poner en master y develop

Se considera origin/master como el branch principal donde está el código fuente que refleja lo que está en producción.

 

Se considera origin/develop como la rama que refleja  un estado con los ultimos cambios de código liberable para el siguiente release. Es el Podría llamarse "branch de integración"

Branches de soporte

  • Feature branches
  • Release branches
  • Hotfix branches

Feature

Sale desde:

develop

 

Debe hacer merge con:

develop

 

Convención de nombrado (Bitbucket):

feature/lo-que-sea

nunca master, develop, release-*, or hotfix-*

Release

Sale desde:

develop

 

Debe hacer merge hacia:

develop y master

 

Convención de nombrado (Bitbucket):

release/lo-que-sea

 

Es una preparación para producción. Pueden corregirse aquí defectos clasificados como bugfixes(no explicado aquí) según Bitbucket

Hotfix

Sale desde:

master

 

Debe hacer merge hacia:

develop y master

 

Convención de nombrado (Bitbucket):

hotfix/lo-que-sea

 

Se utiliza para correcciones urgentes en producción sin interrumpir cambios en la rama de desarrollo.

Conclusión

Si bien no hay mucho de wow en el tema de Git Flow, la importancia radica en la utilidad y el orden que le da a los proyectos.

 

Es más un modelo mental fácil de comprender, y facilita el desarrollo y el intercambio de este entre los miembros del equipo.

 

Considera el avance en el desarrollo de nuevas carácterísticas y la preparación de liberaciones al ambiente de producción.

Recursos

  • https://git-scm.com/book/en/v1/Git-Branching-What-a-Branch-Is
  • http://nvie.com/posts/a-successful-git-branching-model/
  • https://confluence.atlassian.com/bitbucketserver/using-branches-in-bitbucket-server-776639968.html

Git Flow

By Augusto Alonso de la Cruz Jimenez