Cómo usar el comando git bisect para descubrir el primer commit con un error

Escrito por el .
gnu-linux planeta-codigo programacion
Enlace permanente Comentarios

El comando git bisect es muy útil cuando se desea encontrar en que commit se ha introducido un error en un rango de commits ya que permite automatizar la búsqueda sin tener que hacerlo manualmente el desarrollador que simplemente se limita a indicar a Git si el commit a analizar en cada prueba es correcto o incorrecto. Una vez descubierto en que commit se ha introducido el error es cuestión de revisar los cambios de ese commit, analizar sus cambios e identificadas las líneas de código erróneas aplicar la solución.

Git

Una herramienta de control de versiones para el código fuente de las aplicaciones es esencial, para guardar todos los cambios realizados en el código y permitir compartir código entre los desarrolladores aparte de otras funcionalidades proporcionadas. Una de las herramientas de control de versiones más populares es Git, desarrollado por Linus Torvalds también autor original de núcleo Linux entre otros colaboradores.

Una situación habitual al realizar cambios en el código fuente de un programa es pasado un tiempo descubrir un error y no conocer en que cambio lo ha producido y en que commit. Si no se tiene una pista de cual es el cambio que ha introducido error una solución es probar cada commit y para ver si esa versión de la aplicación tiene el error o no. Una vez probados varios commit al final se descubre que commit es el que ha introducido el error. Conociendo el commit que introduce el error hay que revisar los cambios de ese commit para conocer y cambiar las líneas de código erróneas.

El comando git bisect

Una de las funcionalidades que proporciona la herramienta de control de versiones Git es el subcomando bisect. El comando git bisect automatiza encontrar que commit ha introducido un error dado un rango de commits en el que se sospecha está el commit con el error.

El comando git bisect aplica un algoritmo de búsqueda al rango de commits, en función de la indicación que se le proporcione de si el commit tiene o no el error al final del número de comprobaciones que sean necesarias proporciona el primer commit con el error en el rango analizado.

El comando git bisect no se utiliza tan habitualmente como git stash o git commit pero cuando cuando es necesario es muy útil conocer como se usa y usarlo.

El primer paso del comando git bisect es iniciar la bisección y proporcionar el rango de commits a analizar. Una vez proporcionado el rango de commits git cambia el commit del espacio de trabajo según su algoritmo de búsqueda. El siguiente paso suele consistir en arrancar la aplicación y comprobar si el commit tiene o no el error. Una vez conocido si el commit es correcto o tiene el error se le indica a Git con el comando git bisect good o git bisect bad respectivamente. Git a continuación selecciona otro commit teniendo que comprobar de nuevo si el nuevo commit seleccionado es correcto o incorrecto. Después de varias repeticiones de estos pasos se descubre el commit en el que se introdujo el error.

Una vez terminada la bisección o en cualquier momento se puede dar por terminada con el comando git bisect reset y volver a un espacio de trabajo fuera del bisect. El comando git bisect view permite ver el estado de la bisección y los commits analizados.

Estos con los comandos básicos y un ejemplo de uso.

1
2
3
4
5
$ git bisect start
$ git bisect good
$ git bisect bad
$ git bisect reset
$ git bisect (visualize|view)
git-bisect-1.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ git log --pretty=oneline 63575c4f1824c360dbf60aafaaec17401ea604bd..master
022c1b295804bf810743f175358607a0a3bb7307 (HEAD -> master, origin/master) Remove Universal Analytics
a07d1af345907016e19778feb064e08d17f36ed9 Add print_step for display_manager step
39320076b996e4d582bf535f74d1f0b238b3768a Reorder packages
d5233aa726c2626d52de8981bee65dcfbf69ae61 Merge pull request #209 from shuriken1812/master
f7a4790992f859aac6fde86b3b18a72e259545bd Added pipewire-alsa and wireplumber
0b0a1ddca33814e254b3bc395af476156559aac4 Allow to choose display manager
0aeacbab0fe55b71b272d670c76ab52fa2b206c4 Support LightDM autologin
ff01de4f91ff10c6b99b5b6275623ea93ec412ba Update Hugo  ndadd Google Analytics 4
f3038ae0195dddcd98660ebd81721aa5645a8597 Merge pull request #194 from MauroSoli/patch-1
20c5f7a12bbbc372e77187cae7ccd4a1c64c8a1b Change provision configuration description
219f4ab9232b5537364d8b9a0e969520917f3230 add !tpm module
git-log.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[picodotdev@archlinux alis (master $=)]$ git bisect start master 63575c4f1824c360dbf60aafaaec17401ea604bd
Biseccionando: faltan 5 revisiones por probar después de esta (aproximadamente 3 pasos)
[0aeacbab0fe55b71b272d670c76ab52fa2b206c4] Support LightDM autologin
[picodotdev@archlinux alis ((0aeacba...) $|BISECTING)]$ git bisect good
Biseccionando: faltan 2 revisiones por probar después de esta (aproximadamente 2 pasos)
[d5233aa726c2626d52de8981bee65dcfbf69ae61] Merge pull request #209 from shuriken1812/master
[picodotdev@archlinux alis ((d5233aa...) $|BISECTING)]$ git bisect bad
Biseccionando: faltan 0 revisiones por probar después de esta (aproximadamente 1 paso)
[f7a4790992f859aac6fde86b3b18a72e259545bd] Added pipewire-alsa and wireplumber
[picodotdev@archlinux alis ((f7a4790...) $|BISECTING)]$ git bisect bad
Biseccionando: faltan 0 revisiones por probar después de esta (aproximadamente 0 pasos)
[0b0a1ddca33814e254b3bc395af476156559aac4] Allow to choose display manager
[picodotdev@archlinux alis ((0b0a1dd...) $|BISECTING)]$ git bisect bad
0b0a1ddca33814e254b3bc395af476156559aac4 is the first bad commit
commit 0b0a1ddca33814e254b3bc395af476156559aac4
Author: pico.dev <pico.dev@gmail.com>
Date:   Sat Apr 23 14:48:22 2022 +0200

    Allow to choose display manager

 alis.conf |   4 +-
 alis.sh   | 148 +++++++++++++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 112 insertions(+), 40 deletions(-)
 [picodotdev@archlinux alis ((0b0a1dd...) $|BISECTING)]$ git bisect reset
 [picodotdev@archlinux alis (master $=)]$ 
git-bisect-example.sh


Comparte el artículo: