Herramientas de usuario

Herramientas del sitio


informatica:programacion:cursos:control_version_git_avanzado:branching

¡Esta es una revisión vieja del documento!


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:

  1. Abrir nueva rama
  2. Trabajar en ella
  3. La volcamos en la rama principal
  4. Borramos la rama
  5. Abrir nueva rama
  6. Trabajar en ella
  7. La volcamos en la rama principal
  8. 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

informatica/programacion/cursos/control_version_git_avanzado/branching.1685717812.txt.gz · Última modificación: por tempwin