example - ¿Cómo podría usar git bisect para encontrar el primer BUEN compromiso?
git bisect example (5)
Tengo el siguiente problema:
- la versión en el
master
funciona bien - la versión de la última etiqueta antes del
master
(decir lalast
) tiene un error - un colega necesita un parche para su
last
revisión para ese cierto error
Bueno. Preguntémosle a nuestro amigo git bisect
por la revisión que corrigió el error:
git bisect start
git bisect bad last
git bisect good master
Pero eso no va a funcionar:
Algunas buenas revoluciones no son ancestros de la mala rev.
git bisect no puede funcionar correctamente en este caso.
¿Tal vez confundes las buenas y malas revoluciones?
¿Algún indicio para superar esto? ¿Me perdí algo en los documentos?
A partir de git 2.7, puede usar los argumentos --term-old y --term-new.
Por ejemplo, puede identificar un compromiso de corrección de problemas así:
git bisect start --term-new=fixed --term-old=unfixed
git bisect fixed master
git bisect unfixed $some-old-sha1
Mientras prueba, diga git bisect fixed
o git bisect unfixed
según corresponda.
Respuesta anterior, para versiones de git anteriores a 2.7
En lugar de entrenarte temporalmente para pensar que lo malo significa lo bueno y lo bueno significa malo, ¿por qué no crear algunos alias?
En ~/.gitconfig
agregue lo siguiente:
[alias]
bisect-fixed = bisect bad
bisect-unfixed = bisect good
Puede comenzar a identificar un compromiso de solución de problemas de esta manera:
$ git bisect start
$ git bisect-fixed master
$ git bisect-unfixed $some-old-sha1
A medida que realiza la prueba, diga git bisect-fixed
o git bisect-unfixed
según corresponda.
Git ahora te permite usar lo old
y lo new
sin definirlos primero. Tienes que llamar a git bisect start
sin commits como argumentos adicionales, luego comenzar correctamente la bisección llamando
git bisect old <rev>
git bisect new <rev>
https://git-scm.com/docs/git-bisect#_alternate_terms
Esto esencialmente es lo que @MarcH estaba sugiriendo que debería implementarse.
Los alias de Git son una buena idea, sin embargo, los términos fixed
y unfixed
fixed
tienen el mismo problema que el good
y el bad
: no se puede hacer que sean compatibles con regresiones y progresiones. Es fácil encontrar palabras que funcionen en ambos sentidos: simplemente retírelas de la terminología de búsqueda binaria original que es de naturaleza neutral sin preconceptos de lo que es bueno o malo. Por ejemplo:
git config --global alias.bisect-high ''bisect bad''
git config --global alias.bisect-low ''bisect good''
Con términos neutrales como estos, siempre puede escribir: git bisect-high
(o git bisect-upper
, o git-bisect max
, ... ¡su elección!) Ya sea que esté buscando una regresión o una solución .
Lástima que los desarrolladores de git bisect no puedan simplemente reutilizar ninguno de los términos existentes. La interfaz de usuario no es una preocupación de git en términos generales: http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/
Si está usando git bisect run
como he estado haciendo con el comando de prove
de Perl (que ejecuta pruebas automáticas) no tiene posibilidad de intercambiar lo good
y lo bad
. El éxito de las pruebas se informará como código de salida.
He encontrado una sintaxis Bash válida para negar el código de salida del programa ejecutado por git bisect run
:
git bisect start
git bisect bad HEAD # last revision known to PASS the tests
git bisect good $LAST_FAIL_REVISION # last revision known to FAIL the tests
git bisect run bash -c "! prove"
Esto me dio la primera revisión para pasar las pruebas ejecutadas por prove
.
Simplemente "engañaría" a los idiotas y cambiaría los significados de los buenos <=> malos.
En otras palabras, considere "malo" como algo que no muestra el problema, por lo que esta no es la versión "buena" en la que basar el parche.
Bueno y malo son conceptos bastante subjetivos de todos modos, ¿verdad? :)
git bisect start
git bisect good last
git bisect bad master