8 Ramas y fusiones

8.1 Crear y cambiar de rama

git branch nombre

Crea una rama nueva apuntando al commit actual (HEAD), pero no cambia a ella. Sigue trabajándose en la rama anterior.

git switch nombre

Cambia el directorio de trabajo y HEAD a la rama indicada.

git switch -c nombre

Crea la rama y cambia a ella en un solo paso. Equivalente al más antiguo git checkout -b nombre.

git branch

Lista las ramas locales, marcando con un asterisco la rama actual.

git branch -d nombre

Elimina una rama, siempre que sus commits ya estén incorporados en otra rama (protección contra pérdida accidental de trabajo). Con -D se fuerza el borrado igualmente.

8.2 Crear una rama a partir de un commit específico

Una rama no tiene por qué partir del commit actual. Se le puede indicar explícitamente desde qué commit arrancar, usando cualquiera de las formas de referirse a un commit vistas en Referencias y el grafo de commits:

git branch nueva-rama a1b2c3d
git branch nueva-rama HEAD~3
git branch nueva-rama v2.1.0

Esto crea nueva-rama apuntando exactamente a ese commit, dejando HEAD donde estaba (en la rama actual). Para crearla y cambiar a ella de inmediato:

git switch -c nueva-rama HEAD~3

Esto es especialmente útil para retomar el trabajo desde un punto anterior sin perder la rama actual: por ejemplo, si se descubre que un error se introdujo hace varios commits y conviene aislar la corrección a partir de ese punto exacto, en vez de partir desde la punta de la rama con todos los cambios posteriores incluidos.

8.3 Fusionar ramas

git switch main
git merge feature

git merge incorpora los commits de feature en la rama actual (main). Según la situación, ocurre una de dos cosas:

Avance rápido (fast-forward)

Si main no tiene ningún commit propio desde que feature se separó de ella, Git simplemente mueve el puntero de main hasta el mismo commit que feature. No se crea ningún commit de fusión nuevo; el historial queda lineal.

Fusión real

Si ambas ramas avanzaron por separado, Git crea un nuevo commit de fusión con dos padres: la punta anterior de main y la punta de feature. El tree de ese commit combina los cambios de ambas ramas.

8.4 Conflictos de fusión

Un conflicto ocurre cuando ambas ramas modificaron las mismas líneas de un mismo archivo de formas distintas, y Git no puede decidir automáticamente cuál versión prevalece. En ese caso, Git detiene la fusión y marca los archivos en conflicto con marcadores dentro del propio archivo:

<<<<<<< HEAD
versión de la rama actual
=======
versión de la rama que se está fusionando
>>>>>>> feature

Resolver el conflicto consiste en editar el archivo dejando el contenido correcto (que puede ser una de las dos versiones, una combinación, o algo distinto), quitar los marcadores, y luego:

git add archivo-resuelto.txt
git commit

Git recuerda que se estaba en medio de una fusión y prepara automáticamente el mensaje del commit de fusión al ejecutar commit sin argumentos.

Para cancelar una fusión en curso y volver al estado anterior:

git merge --abort