Cómo encontrar un bug con git bisect

Aprende a encontrar bugs con la herramienta git bisect

Encontrar bugs (debugging) es parte diaria de la tarea de un programador. Sin embargo, como los mismos insectos, los bugs se esconden entre las líneas de código y se hacen evidentes después de varios commits en git. Afortunadamente, git cuenta con un comando que permite a los desarrolladores encontrar bugs más rápidamente: git bisect.

Cómo funciona

El comando git bisect sirve para buscar e identificar el commit que introdujo un error en el código o bug. Para esto, el comando utiliza el algoritmo de búsqueda binaria.

En un principio, el desarrollador debe especificar cuál es el commit que sabe que contiene un bug, que por lo general es el commit que se encuentra en la cabeza (HEAD). Después de esto, marca un “buen” commit, es decir, el último commit en el que está seguro que todo funcionaba a la perfección. 

De esta manera, el desarrollador establece los índices más bajos y altos para la búsqueda binaria. A partir de entonces, el comando git bisect nos ayuda a seleccionar el commit entre esos dos puntos hasta reducir la búsqueda para identificar el commit responsable de haber introducido un error.

Cómo utilizar git bisect

  1. En la línea de comandos, establece qué código es bueno y cuál es malo
# Inicia git bisect
$ git bisect start

# Establece un commit donde no haya un bug
$ git bisect good <commit-hash>

# Establece un commit donde no haya un bug
$ git bisect bad <commit-hash>

Bisecting: X revisions left to test after this (roughly Y steps)
[commit-hash] <commit-message>
  1. Después, el proceso va a diseccionar las revisiones y cargarlas por nosotros para verificar si es una versión con bug o sin él.
# Si la versión funciona, escribe
$ git bisect good

# Si la versión falla, escribe
$ git bisect bad

# Después, git bisect responderá con un mensaje similar a este:
Bisecting: 12 revisions left to test after this (roughly 4 steps)

En cada ocasión se realizará una búsqueda binaria para reducir las opciones. 

En caso de tener un script que permita decirnos automáticamente si el código funciona o no, el proceso de debugging se puede automatizar con git bisect:

# Ejecuta git bisect <cmd> …

$ git bisect run node bisect/index.js

Para conocer más sobre cómo funciona git bisect, consulta aquí la documentación o revisa este video para ver al programa en acción: