¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Branching
Sección perteneciente al curso Control de versiones con Git Avanzado.
Introducción
Las ramas en git no son más que una referencia que apunta a un commit.
Para nosotros, por comodidad, es más recomendable pensar en las ramas como itinerarios de commits.
El modelo de trabajo será normalmente:
- Abrir nueva rama
- Trabajar en ella
- La volcamos en la rama principal
- Borramos la rama
- Abrir nueva rama
- Trabajar en ella
- La volcamos en la rama principal
- Borramos la rama
- …
Veremos la metodología git flow.
El modelo de ramas de Git
Tenemos dos concepciones de ramas, una más “humana” que sería un itinerario de commits (la rama apunta al último commit de dicho itinerario); y otra “técnica” donde una rama no es más que una referencia a un commit.
Poner gráfico con la representación de commits y dos ramas
Esto hace que sea muy cómodo trabajar con ramas porque es muy fácil movernos entre ellas al ser un “cartelito” en lugar de números y letras (commit).
Un commit no tiene información sobre a qué rama pertenece.
Recordemos: una rama es una referencia a un commit.
La rama master se crea automáticamente al iniciar un repositorio git.
Cuando HEAD apunta a una rama, al hacer un commit, avanza HEAD y esto hace que la rama también avance con él.
Cuando decimos, por ejemplo, que estamos en master estamos queriendo decir que tenemos HEAD apuntando a la referencia master.
Cuando creamos una nueva rama, lo que hacemos es crear una nueva referencia que apunta al commit en el que estamos. En ese momento nos podemos cambiar a esa nueva rama (checkout) para que HEAD apunte a ella y crear commits sin que master cambie.
Las ramas las vamos a entender siempre como entornos paralelos que creamos para desarrollar una característica o corregir un fallo y, al terminar, volcaremos a la rama principal. Borraremos la rama alternativa.
Trabajo con ramas
Listar ramas
git branch
Git nos señala la rama en la que estamos añadiendo un asterisco delante.
Si el repositorio de git está recién iniciado, el comando anterior no mostrará nada porque no hay ningún commit.
Recordamos que “estar en master” es que HEAD está apuntando a master (HEAD → master).
Creación de ramas
git branch nombre_rama [<commit>]
Cuando no indicamos nada, la rama se crea en el commit en el que estemos.
Al crear la rama, se crea una referencia que apunta a un commit
Ir a una rama:
git checkout nombre_rama
El comando anterior saltará al commit al que apunte dicha rama y HEAD apuntará a esa rama.
Para evitar olvidarnos de cambiar de rama al crearla, podemos usar el siguiente comando que no solo creará la rama sino nos moveremos a ella:
git checkout -b nombre_rama
Eliminar una rama
git branch -d / -D nombre_rama
-d: nos avisa si los commits de la rama que queremos borrar no han sido fusionados.-D: borra la rama sin advertirnos de que se perderán los cambios.
Importante: para eliminar una rama, debemos salir antes de ella.
Recordamos que no se borran los commits realmente sino la referencia, quedando ese itinerario “huérfano”. Si los quisiéramos recuperar, nos ayudaríamos de git refloj.
Renombrar una rama
git branch -m nombre_antiguo nombre_nuevo
Ejemplo de trabajo con ramas
Poner ejemplo en consola del gráfico anterior con dos ramas
Si queremos “mover” una rama existente, podemos hacer:
git branch -f nombre_rama <COMMIT>
Si quisiéramos mover una rama a la rama en la que nos encontramos no hace falta indicar commit:
git branch -f nombre_rama
Fusionando código: merge, rebase y cherry-pick
Git avanzado Ramas - merge HEADdevelop C1 C2 C5 C6 C7 C3 C4 Git avanzado Ramas - merge Fusionar ramas Volcar el trabajo de una rama en otra Objetivo: que una rama tenga los commits de otra Tipos de merge: Fast forward: no crea un nuevo commit, sin conflictos A tres bandas: crea un nuevo commit, posibilidad de conflictos Conflictos: lanzar siempre git status Git avanzado Ramas - rebase HEADdevelop C1 C2 C5 C6 C7 C3 C4 Git avanzado Ramas - rebase Aplicar una rama al final de otra Volcar el trabajo de una rama en otra Objetivo: que una rama tenga los commits de otra No crea un nuevo commit Confictos por pasos: lanzar siempre git status No hacer rebase si ya se ha subido la rama al remoto Git avanzado Ramas - cherry-pick Aplicar un commit aislado a una rama No se aplican los commits anteriores Modificador -x para que añada al mensaje “Cherry-picked from XXXX” Confictos: lanzar siempre git status Git avanzado Ramas - mover referencias git branch -f nombre_rama [<commit>] git reset <commit> –hard Si sólo queremos avanzar la referencia de una rama hasta un commit más avanzado: git merge rama_destino Git avanzado El modelo git flow master branch develop branch feature branch bugfix branch hotfix branch release branch Git avanzado El programa git flow (en Windows ya viene instalado con Git) Empezar a usar git flow en un repositorio: git flow init Iniciar rama: git flow tipo_rama start nombre_rama Cerrar rama: git flow finish
Fusionando código: merge
Ejemplo práctico de merge
Fusionando código: rebase
Ejemplo práctico de rebase
Fusionando código: Cherry-pick
Métodos para mover referencias
Deshacer errores con las ramas
Cómo corregir errores con las ramas
Cómo deshacer un merge
Cómo deshacer una rebase y un Cherry-pick
Git Flow
El modelo git flow
Poniendo en práctica git flow
Conclusión
Recursos
- Capítulo del libro Pro Git sobre branching:
