git bisect
Encontrar el commit que introdujo un error mediante búsqueda binaria
El comando 'git bisect' encuentra el commit que introdujo un error. Marcas un commit como malo (bad, tiene el error) y otro como bueno (good, no lo tiene); git extrae el commit del medio, lo pruebas y respondes good o bad, y git vuelve a dividir los sospechosos a la mitad hasta que solo queda uno. Incluso mil commits solo necesitan unas diez pruebas. git bisect reset te devuelve a donde empezaste.
Sinopsis
git bisect start [<bad> [<good>...]]
git bisect (bad | good) [<rev>...]
git bisect skip [<rev>...]
git bisect reset
git bisect log
git bisect run <cmd>...Opciones
Elegir la opción adecuada
Pruebas necesarias
La búsqueda binaria divide a la mitad los sospechosos cada vez
| Comando | pruebas de bisect |
|---|---|
10 commits | unas 4 |
100 commits | unas 7 |
1000 commits | unas 10 |
Ejemplos
Iniciar una sesión
git bisect startEmpieza la búsqueda.
Marcar commits
git bisect bad && git bisect good v1.0El commit actual es malo, v1.0 era bueno.
Automatizar
git bisect run npm testDeja que un script de pruebas responda por ti.
Terminar
git bisect resetVuelta a tu rama.
Ejemplos de flujos de trabajo
git bisect start HEAD v1.0Malo ahora, bueno en v1.0
git bisect good / git bisect badProbar cada commit que extrae git
git bisect resetVuelta a tu rama
git revert <first-bad>Deshacer al culpable
Solución de problemas
You need to start by "git bisect start"
Causa: No hay ninguna sesión en curso
Ejecuta primero git bisect start
Diste una respuesta equivocada
Causa: Todos los pasos siguientes dependen de ella
git bisect log > log.txt, corrige la línea, git bisect reset, git bisect replay log.txt
Consejos y trampas
Buenas prácticas
- ✓Escribe una prueba automática y usa git bisect run.
- ✓Termina siempre con git bisect reset.
Errores comunes
- ✗Responder mal una sola vez — todos los pasos siguientes serán erróneos (compruébalo con git bisect log).
- ✗Olvidar git bisect reset y seguir trabajando en un HEAD separado.
- ✗Empezar con cambios sin confirmar que estorban en los checkouts.
Preguntas frecuentes
Sí: git bisect start --term-old=fast --term-new=slow, p. ej. para encontrar cuándo algo se volvió lento.