Módulo 1 · Fundamentos que sostienen todo

Lección 06 — Git profesional

Ramas, rebase, conflictos y flujos de equipo: la herramienta de colaboración del oficio.

Publicada
En esta lección
  1. Ejercicio 1 — Commits con intención (
  2. Ejercicio 2 — Rebase interactivo: la historia que te contarás
  3. Ejercicio 3 — Conflicto simulado y resuelto
  4. Ejercicio 4 — Rescate con reflog
  5. Ejercicio 5 — Bisect con suite automática
  6. Ejercicio 6 — GitHub Flow en tu TicketFlow (simulado en solitario)
  7. Entrega

Ejercicios 1-5 se hacen en un repo de laboratorio (~/dev/git-lab) para que puedas romper sin miedo. El 6, en tu TicketFlow real. No mires solutions.md hasta entregar.

Preparación:

bash
mkdir -p ~/dev/git-lab && cd ~/dev/git-lab
git init && echo "# Laboratorio Git" > README.md
git add . && git commit -m "chore: inicio del laboratorio"

Ejercicio 1 — Commits con intención (add -p)

  1. Edita un fichero app.py añadiendo DOS cambios independientes: un fix (typo en un mensaje de error) y una feature (una función nueva). Todo en el mismo fichero.
  2. Con git add -p, separa en dos commits: fix: corrige mensaje de error y feat: añade función X. (usa s para dividir hunks si hace falta; si los cambios están en el mismo hunk, sepáralos editando con e).
  3. git log --oneline: ¿quedaron dos commits limpios? ¿Qué habría pasado si hubieras hecho git add. y un solo commit "update"?

Ejercicio 2 — Rebase interactivo: la historia que te contarás

  1. Haz tres commits descuidados: echo 1 > a.txt; git add.; git commit -m "wip", luego echo 2 >> a.txt;... -m "fix" y echo 3 >> a.txt;... -m "wip2".
  2. git rebase -i HEAD~3 y con squash/reword conviértelos en un único feat: añade contadores a a.txt.
  3. git log --oneline: compara el antes y el después. ¿Qué commits pierden (hashes viejos)? ¿Por qué es seguro aquí y peligroso en una rama compartida?

Ejercicio 3 — Conflicto simulado y resuelto

  1. Crea rama feature-a: cambia la línea 1 de README.md a "Versión A" y commit. Vuelve a main, cambia la misma línea a "Versión B" y commit.
  2. git merge feature-a: ¿qué dice Git exactamente? Abre el fichero y examina los marcadores <<<<<<< ======= >>>>>>>.
  3. Resuelve (elige A, B o una tercera redacción), git add y termina el merge. Borra la rama. git log --graph --oneline --all: describe el grafo resultante.
  4. Repite el escenario con rebase en vez de merge (rama nueva, mismo conflicto): ¿en qué se diferencia el grafo final?

Ejercicio 4 — Rescate con reflog

  1. En el laboratorio, haz un commit cualquiera y anota su hash: git log --oneline -1.
  2. "Dispara al pie": git reset --hard HEAD~1.
  3. Encuentra el commit "perdido" con git reflog y recupéralo con git reset --hard HEAD@{n} (o crea una rama apuntando a él). Verifica con git log.
  4. Escribe en una línea cuándo usarías reflog vs git revert (pista: ¿el commit llegó ya a main compartido?).

Ejercicio 5 — Bisect con suite automática

  1. Crea un script test.sh que falle si existe el fichero bug.txt:
bash
#!/usr/bin/env bash
if [[ -f bug.txt ]]; then echo "FALLO"; exit 1; fi
echo "OK"; exit 0
  1. Haz 5 commits; en el 4º crea bug.txt (y en el 5º añade otro fichero distinto).
  2. Ejecuta: git bisect start HEAD HEAD~4 (mal = HEAD, bien = hace 4) y luego git bisect run./test.sh. ¿Qué commit señala? ¿Coincide con el que creó el bug?
  3. git bisect reset. ¿Cuántas pruebas hizo Git para localizarlo? ¿Cuántas habrías hecho a mano?

Ejercicio 6 — GitHub Flow en tu TicketFlow (simulado en solitario)

  1. En tu repo real: crea feat/salud-detallada y añade un endpoint /api/health/detail/ que devuelva versión y uptime del proceso (2 campos, poco código).
  2. Commit con mensaje convencional completo (feat + cuerpo con el porqué) y crea la rama en GitHub (git push -u origin feat/salud-detallada).
  3. Abre la PR: título convencional, descripción con contexto y checklist. Hazte el review a ti mismo con dos observaciones honestas.
  4. Fusiona con squash. git log --oneline: ¿cómo quedó la historia? ¿La rama quedó borrada (opción del botón)?

Entrega

Pega outputs (log --graph, reflog, resultado del bisect) y el enlace/contenido de tu PR. Cierra la 06 y cierra con ella el Módulo 1 completo: pasamos a la Lección 07 — SQL avanzado (el módulo 2, la habilidad más determinante del oficio).