your you track the helps git version-control git-bisect

you - git-blame



¿Cómo `git bisect` solo en las confirmaciones de una rama? (4)

En un proyecto en el que estoy trabajando actualmente, mantenemos cada característica en su propio brach y la fusionamos para volver a dominar cuando la característica esté lista. Las confirmaciones dentro de cada rama de características pueden incluir una gran cantidad de "WIP" y la funcionalidad de ruptura de otras características hasta que esté completa y estable.

De todos modos, dado que las confirmaciones de la rama maestra son las únicas (supuestamente) estables, quiero obtener git bisect solo en esa rama.

¿Hay una manera de limitar git bisect solo en una rama?


Creo que git bisect con una --no-parent podría hacer esto fácilmente, pero no existe.

Lo único que se me ocurre es recrear solo los compromisos de rama en una nueva rama. Aquí hay un ejemplo en el shell de Linux:

$ git branch bisecttemp <first> $ for h in `git log --oneline --decorate --first-parent --reverse --format=%H <first>..<last>`; do git checkout -f $h; sleep .5; git reset bisecttemp; git commit -am"$h"; git checkout testing; git reset --hard HEAD@{1}; done

Eso hace que una rama bisecttemp salga del <first> compromiso que nos importa, obtiene una lista de los hashes entre el <first> y el <last> en el rango que nos importa, visita cada uno, vuelve a la rama bisecttemp después de cada uno Sin cambiar el árbol de trabajo, se compromete todo de manera diferente con el hash de la confirmación de la que vino, comprueba bisecttemp nuevamente y luego la restablece al último lugar donde estaba la cabecera, que es la nueva confirmación.

Puede haber una forma más inteligente de hacer todo esto, pero lo básico es que crea una nueva rama a partir del inicio del rango de confirmaciones que nos interesan, y luego compromete el estado de las confirmaciones de solo sucursal (confirmaciones y combinaciones regulares, pero no cualquier sub-rama se compromete a ello, en orden. No se puede simplemente elegir aquí, como lo hacen los padres, y eso fracasaría en los compromisos de fusión.

Esto no está realmente probado, y todo podría estar mal. Es solo un pensamiento. Todo podría ser enrollado en una función que toma un rango de confirmaciones.


No hay una manera fácil de lograr esto sin trabajo adicional. Después de jugar con él por un rato, tengo algo que podría ayudarte.

git bisect start master f9d5924 for rev in $(git rev-list f9d5924..master --merges --first-parent); do git rev-list $rev^2 --not $rev^ done | xargs git bisect skip

Esto inicia git f9d5924 con f9d5924 como su buen compromiso y el master como su mal compromiso. Luego encuentra los ancestros del lado derecho de cada compromiso de fusión que no están en el lado izquierdo. Pasa esos antepasados ​​a git bisect skip para saltarlos. Sin embargo, cuando descubra qué compromiso es incorrecto, mostrará todos los posibles compromisos omitidos del compromiso de fusión erróneo. como el siguiente

$ git bisect good There are only ''skip''ped commits left to test. The first bad commit could be any of: 0622204625d8817c5d8fd1a2a68b3aa91f2dcdf9 0c771566b9e77e3bdc0a66a7404c8eae9f321a68 5098b44f43f84b213eaab110073a6acd26a5cc02 8b05a808d5e15852fbddaa529ba241fdac8ff693 b0c755c3fa57e3c8d527e76fae38bc9925c01353 We cannot bisect more!

En este caso b0c755c3fa57e3c8d527e76fae38bc9925c01353 fue la confirmación de combinación en la que falló.

EDITAR: Esto no funcionará si tiene una combinación de pulpo.


Para usar git bisect en una rama sin consultar a master:
Estar en la rama que quieres probar.

git bisect start --no-checkout

Esto iniciará la bisecta en la rama actual solamente

Continuar su bisecto como de costumbre.


También me gustaría una solución adecuada y nativa a git para esta pregunta, solo verificando confirmaciones en una sola rama y, por lo tanto, "culpando" a toda una fusión y / o solicitud de extracción. Sin embargo:

ya que las confirmaciones de la rama maestra son las únicas (supuestamente) estables, quiero git bisect solo en esa rama.

Si el problema que genera esta pregunta es que algunas de las confirmaciones que le están dando están rotas y no puede probar, puede usar:

git bisect skip

Para omitir ese compromiso por completo y marcar uno diferente. Esto resolverá el problema que tienes con las confirmaciones rotas. Una vez que encuentre la confirmación que rompió la función, puede seguirla hasta la combinación en la rama que está siguiendo.

Supongo que incluso podría git bisect skip TODAS las confirmaciones que no se fusionen, ya sea manualmente o mediante un script. Eso daría el comportamiento planteado en la pregunta.