Tema 27: Encontrar el primer commit defectuoso
A veces sabes que una versión funciona y otra falla, pero no qué cambio introdujo el problema. Bisect reduce la búsqueda probando versiones intermedias. Necesitas una comprobación repetible que distinga correcto de defectuoso; una impresión cambiante no sirve para marcar versiones con confianza.
git bisect start inicia la búsqueda. git bisect good <commit> marca una versión conocida que funciona y git bisect bad <commit> otra que falla. Git selecciona una revisión intermedia. Compruébala y ejecuta git bisect good o git bisect bad sin referencia para clasificar la posición que estás visitando.
La búsqueda va descartando intervalos. Cuando good y bad delimitan un único salto, Git informa del primer commit defectuoso. La práctica usa una línea de commits y presupone que, desde el primer fallo, las versiones siguientes siguen fallando en esa misma comprobación. Si el fallo aparece y desaparece, debes definir con más cuidado qué estás investigando.
En el laboratorio el botón «Probar versión» hace una comprobación fija: app.txt falla si contiene ERROR. No ejecuta el archivo ni código del alumno. El botón informa; tú debes marcar good o bad. Puedes consultar el contenido con grep o con el editor, sin modificarlo durante la búsqueda.
Termina siempre con git bisect reset. Recupera la posición desde la que empezaste. Encontrar un fallo no lo corrige y no crea automáticamente un commit de reparación. Anota el identificador hallado, lee el cambio y plantea después una corrección independiente.
Comandos para probar #
1git bisect start 2git bisect good 0000001 3git bisect bad main 4git bisect good 5git bisect reset
Error que conviene evitar #
Marcar una versión por intuición sin ejecutar la misma comprobación o olvidar bisect reset y seguir trabajando en una posición de diagnóstico.
Laboratorio local #
Prueba los comandos y observa qué cambia. Puedes reiniciar sin guardar una entrega. Los retos evaluables y el cuestionario están en las actividades de este tema.
Git / práctica local
Localiza una regresión
Aplicar edición cambia el archivo; git add lo prepara.
Historial de commits
Las líneas conectan los commits con sus padres. Los commits que ya no tienen una referencia también permanecen visibles en este laboratorio.
- 0000007: Versión 7; HEAD → main
- 0000006: Versión 6;
- 0000005: Versión 5;
- 0000004: Versión 4;
- 0000003: Versión 3;
- 0000002: Versión 2;
- 0000001: Commit inicial;
Comparar trabajo, índice y HEAD
Trabajo
# Mi proyecto
Índice (staging)
# Mi proyecto
HEAD
# Mi proyecto
TERMINAL
Sesión local preparada. Escribe help para consultar los comandos de este tema.
Comandos disponibles y límites
git --version · git config --global <clave> [valor] git init · git status git add <archivo | .> · git commit -m "mensaje" · git log git log --oneline · git switch <rama> (antes: checkout) git restore [--staged] <archivo> · git commit --amend [-m "mensaje" | --no-edit] git switch --detach <commit> · HEAD · HEAD~1 git diff [--staged | <commit> <commit>] git remote [-v] · git remote add <nombre> <URL> · git remote get-url <nombre> · git remote set-url <nombre> <URL> git clone <URL> git push [-u] <remoto> <rama> ssh-keygen -t ed25519 · ssh -T git@github.com (ficticios) git branch [nombre] · git branch -m <nombre> · git branch -d <rama> · git switch -c <rama> git merge [--ff-only] <rama> git merge --no-ff <rama> · git log --graph --all --decorate git merge --abort · editar conflicto, git add y git commit -m "mensaje" git config --global alias.st status · git st git tag [nombre] · git tag -a <nombre> -m "mensaje" · git tag -n · git push origin <tag> git reset --soft|--mixed|--hard <commit> · git reflog git stash push [-u] [-m "mensaje"] · list · show · apply · pop · drop git rebase <rama> · git rebase --continue · git rebase --abort git grep [-n] <texto> [revisión] git rebase -i <base> (editar lista) · git merge --squash <rama> git bisect start · good [commit] · bad [commit] · reset help · clear
Sesión en memoria: recargar descarta la práctica. Doscientas acciones como máximo. Dos archivos editables de hasta 250 líneas. Diez ramas como máximo. Diez entradas de stash como máximo. El modelo no ejecuta comandos reales ni realiza conexiones externas. diff muestra contenido anterior y posterior por archivo. grep busca texto literal. La lista interactiva conserva el orden y agrupa todos los commits seleccionados.
Resumen
- Delimita el salto entre una versión correcta y otra que falla.
- Debe basarse en una comprobación repetible.
- No significa que todo el proyecto esté mal, sino que falla esa comprobación.
- Marcar una versión por intuición sin ejecutar la misma comprobación o olvidar bisect reset y seguir trabajando en una posición de diagnóstico.