git bisect es una herramienta para encontrar automáticamente el commit que introdujo un bug usando búsqueda binaria.
La idea es elegante y brutalmente eficiente:
si sabes que un commit viejo funcionaba y uno nuevo está roto, Git puede ir probando commits intermedios para encontrar exactamente dónde apareció el problema.
Esto evita revisar manualmente decenas o cientos de commits.
Supón que tienes 100 commits.
En vez de revisar uno por uno:
1,2,3,4,5,6,7,8...
git bisect prueba el punto medio.
Si el bug está ahí:
-
revisa la mitad más vieja si no:
-
revisa la mitad más nueva
Cada paso reduce el espacio de búsqueda a la mitad.
Con 100 commits, normalmente encuentras el culpable en ~7 pasos.
Esto es literalmente el mismo algoritmo que se usa para buscar en listas ordenadas.
Cuando sabes:
- que ahora algo está roto
- que antes funcionaba
- pero no sabes en qué commit se rompió
git bisect startNormalmente el actual:
git bisect badEjemplo:
git bisect good a1b2c3dAhora Git empieza la búsqueda.
Git automáticamente se mueve a un commit intermedio:
Bisecting: 12 revisions left to test after this
Ahora pruebas el código.
- si el bug aparece →
bad - si funciona →
good
git bisect bad
git bisect good a1b2c3dGit salta a un commit intermedio.
Pruebas la app.
Si está roto:
git bisect badSi funciona:
git bisect goodGit vuelve a calcular el siguiente punto.
Repite esto hasta encontrar el commit culpable.
Git dirá algo como:
commit d4e5f6g is the first bad commit
Ese es el commit que introdujo el bug.
Cuando termines:
git bisect resetEsto te regresa a la rama original.
Supón que tu proyecto tiene esta historia:
A---B---C---D---E---F---G---H
Sabes:
Hestá rotoBfuncionaba
Entonces:
git bisect start
git bisect bad H
git bisect good BGit probará:
E
Si E funciona:
bug está entre F y H
Si E está roto:
bug está entre C y E
Así se reduce el espacio de búsqueda rápidamente.
Esto es donde se vuelve realmente poderoso.
Si tienes un script de prueba que devuelve:
0→ funciona1→ falla
Puedes hacer:
git bisect run ./test-script.shGit automáticamente:
- cambia commit
- ejecuta el script
- marca good/bad
- continúa
Hasta encontrar el commit culpable.
Esto es extremadamente útil en proyectos grandes.
git bisect start
git bisect bad
git bisect good v1.2.0
git bisect run npm testGit ejecutará npm test en cada commit hasta encontrar el primero que falla.
Para usar bisect necesitas dos cosas claras:
- un commit bueno
- un commit malo
Si no sabes cuándo empezó el bug, primero necesitas investigar eso.
- bugs introducidos semanas atrás
- regresiones difíciles de rastrear
- proyectos con cientos de commits
- cambios donde el culpable no es obvio
- cuando el bug depende de estado externo
- cuando el proyecto no compila en commits antiguos
- cuando el error es no determinístico
Iniciar bisect:
git bisect startMarcar commit roto:
git bisect badMarcar commit bueno:
git bisect good <commit>Automatizar pruebas:
git bisect run script.shTerminar bisect:
git bisect resetgit bisect = encontrar el commit que introdujo un bug usando búsqueda binaria
Flujo típico:
git bisect start
git bisect bad
git bisect good <commit-bueno>
# probar
git bisect good | git bisect bad
# repetir
git bisect resetUn detalle fascinante del diseño de Git es que bisect convierte el historial del repositorio en un espacio de búsqueda algorítmico. En vez de revisar commits manualmente, Git usa el mismo principio matemático que emplean los algoritmos de búsqueda eficientes. Lo que para un humano podría tomar horas revisando commits uno por uno, Git lo reduce a unos pocos pasos lógicos.