Capítulo 10 de 33 7 secciones 6 min

Trabajar en dos cosas a la vez

Las ramas, que son mucho más simples de lo que parecen

Una rama es un nombre que apunta a un commit. Nada más. Lo que a mí me confundió años es que suena a copiar la carpeta, y no se copia nada: cambiar de rama es mover un puntero y que Git te acomode los archivos. Por eso es instantáneo aunque el proyecto sea enorme 🌿

Para qué sirven

Estás con el reporte nuevo y llega un arreglo urgente. Con una sola rama tienes las dos cosas mezcladas en la misma carpeta y no puedes entregar una sin la otra.

Con ramas trabajas en dos líneas de tiempo distintas y saltas entre ellas.

mkdir tienda
cd tienda
git init -q
printf 'ciudad,monto\nLima,1200\n' > ventas.csv
git add ventas.csv
git commit -q -m "Primeras ventas de Lima"
git branch
* main

Una sola rama, main, y el asterisco dice que estás en ella.

Crear y entrar, en un solo movimiento

git switch -c reporte-por-canal
git branch
Switched to a new branch 'reporte-por-canal'
  main
* reporte-por-canal

El -c es de crear. Ojo con esto porque es donde más gente se tropieza: git branch nombre crea la rama pero no te lleva a ella, y terminas haciendo los commits en el sitio equivocado.

Trabajo aquí:

printf 'canal\nbodega\n' > canales.csv
git add canales.csv
git commit -q -m "Se agrega el catalogo de canales"
git log --oneline
c516683 Se agrega el catalogo de canales
54da6e2 Primeras ventas de Lima

Y ahora el salto

git switch main
ls
git log --oneline
Switched to branch 'main'
ventas.csv
54da6e2 Primeras ventas de Lima

Aquí está la magia: canales.csv no está. No se borró, está en la otra rama. Tu carpeta cambia de contenido según dónde estés parada, y por eso hay que mirar en qué rama estás antes de empezar a trabajar 🧭

Hago el arreglo urgente aquí, tranquila:

printf 'Arequipa,890\n' >> ventas.csv
git add ventas.csv
git commit -q -m "Urgente, entran las ventas de Arequipa"
git log --all --oneline --graph
* 1976933 Urgente, entran las ventas de Arequipa
| * c516683 Se agrega el catalogo de canales
|/  
* 54da6e2 Primeras ventas de Lima

Dos líneas de tiempo que salieron del mismo punto. Juntarlas es el capítulo 11.

Borrar una rama

git switch -c prueba
git switch main
git branch -d prueba
git branch
Switched to a new branch 'prueba'
Switched to branch 'main'
Deleted branch prueba (was 1976933).
* main
  reporte-por-canal

Se borró sin quejarse porque no tenía nada que perder. Pero si la rama tiene commits que no están en ningún otro sitio, Git se planta:

git branch -d reporte-por-canal
error: the branch 'reporte-por-canal' is not fully merged.
If you are sure you want to delete it, run 'git branch -D reporte-por-canal'

Not fully merged: ahí dentro hay trabajo que no está en main. Ese aviso ha salvado muchísimo trabajo, y por eso la -D mayúscula conviene tratarla con el mismo respeto que reset --hard.

La trampa

Te piden un cambio urgente en el reporte de ventas mientras estás a medias con otra cosa. Creas la rama para el arreglo urgente y te pones a trabajar.

$ git branch arreglo-urgente
$ nano reporte.py         # haces el arreglo
$ git add reporte.py
$ git commit -m "Arreglo urgente del reporte"
$ git branch

  arreglo-urgente
* main
Qué está mal

El commit se fue a main, no a la rama 🌿

git branch crea la rama pero no te lleva a ella. Es la diferencia entre poner un marcador en el mapa y caminar hasta ahí. Fíjate en el asterisco de la salida: sigue en main.

Por eso en este libro siempre uso git switch -c, que crea y entra en el mismo movimiento. git branch a secas lo dejo solo para listar.

Si ya te pasó no perdiste nada: el commit existe, solo está en la rama equivocada. Con lo del capítulo 7 y una rama nueva se mueve de sitio.

Comprueba que se entendió

Comprueba que lo tienes

Estás en una rama, haces git switch main y un archivo tuyo desaparece de la carpeta. ¿Qué pasó?

  • Se borró y hay que recuperarlo
  • Está en la otra rama, vuelve y aparece
  • Git lo mandó al stash
  • Hay que hacer un merge para recuperarlo

Ejercicios

1. Vuelve a tu rama y comprueba

Regresa a la rama del reporte y mira que el archivo está.

git switch reporte-por-canal
ls
Switched to branch 'reporte-por-canal'
canales.csv
ventas.csv

Ahí estaba, sano y salvo. Cambiar de rama es gratis y no pierde nada, y eso es lo que hay que interiorizar.

2. Y que aquí falta lo urgente

Mira el CSV de ventas en esta rama.

cat ventas.csv
ciudad,monto
Lima,1200

Arequipa no está, porque ese commit vive en main. Las dos ramas tienen versiones distintas del mismo archivo y las dos son correctas.

3. Una rama por cada cosa

Crea una tercera rama para el catálogo de clientes y haz un commit ahí.

git switch main
git switch -c catalogo-clientes
printf 'bodega,ciudad\nBodega Sol,Lima\n' > clientes.csv
git add clientes.csv
git commit -q -m "Se agrega el catalogo de bodegas"
git branch
Switched to branch 'main'
Switched to a new branch 'catalogo-clientes'
* catalogo-clientes
  main
  reporte-por-canal

Tres ramas, tres asuntos separados. Este es el flujo normal de cualquier proyecto con más de una persona.

4. Mira el árbol completo

Dibuja todas las ramas a la vez.

git log --all --oneline --graph
* 4152b62 Se agrega el catalogo de bodegas
* 1976933 Urgente, entran las ventas de Arequipa
| * c516683 Se agrega el catalogo de canales
|/  
* 54da6e2 Primeras ventas de Lima

Se ve el tronco común y de dónde sale cada rama. Este dibujo es lo que uso para explicarle Git a alguien en dos minutos 🎨

5. En qué rama estoy

Pregunta solo el nombre de la rama actual.

git branch --show-current
catalogo-clientes

Un comando de una línea que evita la mitad de los accidentes. Yo lo tengo puesto en la propia terminal para verlo siempre.

6. Qué ramas ya están juntas con main

Lista las ramas cuyo trabajo ya está en la rama actual.

git switch main
git branch --merged
Switched to branch 'main'
* main

Solo aparece main, porque las otras dos tienen commits propios. Este comando dice cuáles se pueden borrar sin pensarlo.

7. Intenta borrar una rama con trabajo dentro

Prueba a borrar la del catálogo de clientes.

git branch -d catalogo-clientes
error: the branch 'catalogo-clientes' is not fully merged.
If you are sure you want to delete it, run 'git branch -D catalogo-clientes'

Git te frena y te dice cómo insistir si de verdad quieres. Ese "si estás segura" es de las mejores cosas que tiene 🛑

Lo que te llevas

Una rama es un nombre que apunta a un commit. Cambiar de rama no copia nada, mueve un puntero.

¿Tienes alguna duda o consulta?