Git Flow¶
Info oficial -> Git Flow
Repositorio oficial -> Git Flow en Github
Git Flow es una forma ordenada de trabajar con GIT en proyectos SW. Consiste en tener todo separado por ramas y seguir una política de rabajo y commits muy específicas con ellas. Así que tendremos:
master
:- Rama principal que tendrá código final (testado y validado) preparado para ser subido a producción o en producción.
- No se trabaja sobre ella, es decir, todo el código que le llega es a través de un merge.
- Todos los "commits" (merges) que hay sobre ella, tienen un
tag
definido, que indica la versión del programa.
develop
:- Es la rama de desarrollo principal.
- Para implementar git-flow al menos deben de estar
master
ydevelop
. - Tiene código de futuras versiones (
master
solo código estable para producción). - De ella derivan las demás ramas de desarrollo.
feature-<característica>
:- Estas son ramas que parten de
develop
. - Son para desarrollar una única característica por rama.
- Cuando se acaba, se mergea con
develop
y se finaliza la rama.
- Estas son ramas que parten de
release/<version>
:- Parten de
develop
. - Tienen código estable preparado para ser subido a
master
a falta de un buen testeo. - Una vez su código está listo, se mergea tanto con
develop
como conmaster
y se finaliza la rama.
- Parten de
hofix/<version>
:- Parten de
master
. - Si en producción se encuentra un error, se genera esta rama, con la versión del código en producción como nombre, se arregla.
- Por último se mergea con
develop
como conmaster
(poniéndole untag
que aumente la versión) y se finaliza la rama.
- Parten de
support/<version>
:- Esto no lo cubre en realidad Git Flow.
- Las ramas support son para si se mantienen distintas versiones al mismo tiempo.
- Sería equivalente a una rama
master
pero solo para una versiónmajor
de tu programa.
Pueden existir incluso más ramas, como las pull-request/<version>
.
Ejemplo de Git Flow en vertical
Ejemplo de Git Flow en horizontal
Otra imagen en horizontal de Git Flow
Instalación¶
Instrucciones para la instalación -> aquí
Plugins¶
Plugin oficial¶
Existe un plugin oficial para tener autocompletado en bash
o zsh
-> git-flow-completion
Plugin ZSH¶
ZSH trae ya el suyo propio -> git-flow plugin
Estos son sus alias
Alias | Command | Description |
---|---|---|
gfl |
git flow |
Git-Flow command |
gfli |
git flow init |
Initialize git-flow repository |
gcd |
git checkout develop |
Check out develop branch |
gch |
git checkout hotfix |
Check out hotfix branch |
gcr |
git checkout release |
Check out release branch |
gflf |
git flow feature |
List existing feature branches |
gflh |
git flow hotfix |
List existing hotfix branches |
gflr |
git flow release |
List existing release branches |
gflfs |
git flow feature start |
Start a new feature: gflfs <name> |
gflhs |
git flow hotfix start |
Start a new hotfix: gflhs <version> |
gflrs |
git flow release start |
Start a new release: gflrs <version> |
gflff |
git flow feature finish |
Finish feature: gflff <name> |
gflfp |
git flow feature publish |
Publish feature: gflfp <name> |
gflhf |
git flow hotfix finish |
Finish hotfix: gflhf <version> |
gflrf |
git flow release finish |
Finish release: gflrf <version> |
Configuración¶
Configurar un diferente repositorio remoto (origin)¶
Fetchin por defecto antes de operaciones locales¶
Se puede sobreescribir el comando añadiéndole el argumento --nofetch
Evitar etiquetas automáticas creadas en los hotfixes¶
Comandos¶
La lista de comandos oficial -> [https://github.com/nvie/gitflow/wiki/Command-Line-Arguments]
Cheatsheet¶
# Listar comandos
git flow
# Inicializar repo
git flow init [-d]
# Ramas feature
git flow feature
git flow feature start <name> [<base-commit-from-develop>]
git flow feature finish <name>
git flow feature pull <remote> <name>
git flow feature publish <name>
# Ramas release
git flow release
git flow release start <release> [<base-commit-from-develop>]
git flow release finish <release>
# Ramas hotfix
git flow hotfix
git flow hotfix start <release> [<base-commit-from-master>]
git flow hotfix finish <release>
# Ramas support
git flow support
git flow support start <release> <base-commit-from-master>
Comandos a fondo¶
Ver todos los comandos¶
Inicializacion¶
# Inicializar repo con git flow
# -d = default -> ramas con nombres por defecto
# -f = force
git flow init [-d] [-f]
Feature¶
# Ver ramas feature
# -v = verbose
git flow feature [list] [-v]
# Inicializar una rama feature/<name>
# -F = fetch -> de origin antes de la operacion
# <base> -> commit de develop del que se parte
git flow feature start [-F] <name> [<base>]
# Finalizar una rama feature/<name>
# -r = rebase en vez de merge
# -F = fetch -> de origin antes de la operacion
# -k = keep -> mantener la rama despues de finalizar
# -D = delete -> borrado forzado despues de finalizar
# -S = squash -> aplastar commits durante el merge
git flow feature [-rFkDS] finish <name>
# Pull de la rama remota (de origin)
git flow feature pull <remote> [<name>]
# Push a la rama remota (de origin)
git flow feature publish <name>
# Empezar a seguir feature/<name> que es compartida en origin
git flow feature track <name>
# Cambiar a la rama feature <name>
git flow feature checkout [<name>]
# Ver diferencias respecto a develop
git flow feature diff [<name>]
# Rebase la feature <name> en develop
# -i = interactive
git flow feature rebase [-i] [<name>]
# Eliminar rama feature/<name>
# -f = force -> eliminar rama que no ha sido mergeada
git flow feature delete [-f] <name>
Release¶
# Ver ramas release
# -v = verbose
git flow release [list] [-v]
# Inicializar una rama release/<version>
# -F = fetch -> de origin antes de la operacion
git flow release start [-F] <version>
# Finalizar una rama release/<version>
# -F = fetch -> de origin antes de la operacion
# -s = sign -> firmar release tag criptográficamente
# -u = GPG-key -> usar la clave GPG-key para firmar digitalmente (se usa con -s)
# -m = message -> mensaje del tag
# -p = push -> push a origin despues de la operación
# -k = keep -> mantener la rama despues de finalizar
# -n = no-tag -> no etiquetar esta release
# -S = squash -> aplastar commits durante el merge
git flow release finish [-FsumpknS] <version>
# Push a la rama remota (de origin)
git flow release publish <name>
# Empezar a seguir release/<name> que es compartida en origin
git flow release track <name>
# Eliminar rama release/<name>
# -f = force -> eliminar rama que no ha sido mergeada
git flow release delete [-f] <name>
Hotfix¶
# ver ramas hotfix
# -v = verbose
git flow hotfix [list] [-v]
# Inicializar una rama hotfix/<version>
# -F = fetch -> de origin antes de la operacion
git flow hotfix start [-F] <version> [<base>]
# Finalizar una rama hotfix/<version>
# -F = fetch -> de origin antes de la operacion
# -s = sign -> firmar release tag criptográficamente
# -u = GPG-key -> usar la clave GPG-key para firmar digitalmente (se usa con -s)
# -m = message -> mensaje del tag
# -p = push -> push a origin despues de la operación
# -k = keep -> mantener la rama despues de finalizar
# -n = no-tag -> no etiquetar esta release
# -S = squash -> aplastar commits durante el merge
git flow hotfix finish [-FsumpknS] <version>
# Eliminar rama hotfix/<name>
# -f = force -> eliminar rama que no ha sido mergeada
git flow hotfix delete [-f] <name>