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:
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)
- Edita un fichero
app.pyañadiendo DOS cambios independientes: un fix (typo en un mensaje de error) y una feature (una función nueva). Todo en el mismo fichero. - Con
git add -p, separa en dos commits:fix: corrige mensaje de erroryfeat: añade función X. (usaspara dividir hunks si hace falta; si los cambios están en el mismo hunk, sepáralos editando cone). git log --oneline: ¿quedaron dos commits limpios? ¿Qué habría pasado si hubieras hechogit add.y un solo commit "update"?
Ejercicio 2 — Rebase interactivo: la historia que te contarás
- Haz tres commits descuidados:
echo 1 > a.txt; git add.; git commit -m "wip", luegoecho 2 >> a.txt;... -m "fix"yecho 3 >> a.txt;... -m "wip2". git rebase -i HEAD~3y consquash/rewordconviértelos en un únicofeat: añade contadores a a.txt.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
- Crea rama
feature-a: cambia la línea 1 deREADME.mda "Versión A" y commit. Vuelve amain, cambia la misma línea a "Versión B" y commit. git merge feature-a: ¿qué dice Git exactamente? Abre el fichero y examina los marcadores<<<<<<< ======= >>>>>>>.- Resuelve (elige A, B o una tercera redacción),
git addy termina el merge. Borra la rama.git log --graph --oneline --all: describe el grafo resultante. - 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
- En el laboratorio, haz un commit cualquiera y anota su hash:
git log --oneline -1. - "Dispara al pie":
git reset --hard HEAD~1. - Encuentra el commit "perdido" con
git reflogy recupéralo congit reset --hard HEAD@{n}(o crea una rama apuntando a él). Verifica congit log. - Escribe en una línea cuándo usarías
reflogvsgit revert(pista: ¿el commit llegó ya a main compartido?).
Ejercicio 5 — Bisect con suite automática
- Crea un script
test.shque falle si existe el ficherobug.txt:
#!/usr/bin/env bash
if [[ -f bug.txt ]]; then echo "FALLO"; exit 1; fi
echo "OK"; exit 0- Haz 5 commits; en el 4º crea
bug.txt(y en el 5º añade otro fichero distinto). - Ejecuta:
git bisect start HEAD HEAD~4(mal = HEAD, bien = hace 4) y luegogit bisect run./test.sh. ¿Qué commit señala? ¿Coincide con el que creó el bug? 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)
- En tu repo real: crea
feat/salud-detalladay añade un endpoint/api/health/detail/que devuelva versión y uptime del proceso (2 campos, poco código). - Commit con mensaje convencional completo (feat + cuerpo con el porqué) y crea la rama en GitHub (
git push -u origin feat/salud-detallada). - Abre la PR: título convencional, descripción con contexto y checklist. Hazte el review a ti mismo con dos observaciones honestas.
- 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).