¿Cómo puedo saber si una confirmación es descendiente de otra confirmación?

Resuelto engie asked hace 14 años • 8 respuestas

Con Git, ¿cómo puedo saber si una confirmación en mi rama es descendiente de otra confirmación?

engie avatar Jun 09 '10 18:06 engie
Aceptado

Desde Git 1.8.0, esto se admite como opción para merge-base:

git merge-base --is-ancestor <maybe-ancestor-commit> <descendant-commit>

Desde la página de manual:

--es-ancestro

Compruebe si el primero es un antepasado del segundo y salga con el estado 0 si es verdadero, o con el estado 1 si no. Los errores se señalan mediante un estado distinto de cero que no es 1.

Por ejemplo:

git merge-base --is-ancestor origin/master master; echo $?
Matt R avatar Nov 23 '2012 09:11 Matt R

Si desea verificar esto mediante programación (por ejemplo, en un script), puede verificar si git merge-base A Bes igual a git rev-parse --verify A(entonces se puede acceder a A desde B) o si lo es git rev-parse --verify B(entonces se puede acceder a B desde A). git rev-parseAquí es necesario convertir del nombre de confirmación a la confirmación SHA-1 / ID de confirmación.

También es posible utilizar git rev-listMe gusta en la respuesta VonC .

Editar: en Git moderno hay soporte explícito para esta consulta en forma de git merge-base --is-ancestor.


Si una de las confirmaciones por las que pregunta es una sugerencia de rama , entonces git branch --contains <commit>podría git branch --merged <commit>ser una mejor solución no programática.

Jakub Narębski avatar Jun 09 '2010 13:06 Jakub Narębski

Este tipo de operaciones se basa en la noción de rango de revisiones detallada en la pregunta SO: " Diferencia en 'git log origin/master' vs 'git log origin/master..' ".

git rev-listdebería poder retroceder desde una confirmación, hasta otra si es posible alcanzarla.

Entonces intentaría:

git rev-list --boundary 85e54e2408..0815fcf18a
0815fcf18a19441c1c26fc3495c4047cf59a06b9
8a1658147a460a0230fb1990f0bc61130ab624b2
-85e54e240836e6efb46978e4a1780f0b45516b20

(Las confirmaciones de límites tienen el prefijo -)

Si la última confirmación mostrada es la misma que la primera confirmación en el git rev-listcomando, entonces es una confirmación accesible desde la segunda confirmación.

Si no se puede acceder a la primera confirmación desde la segunda, git rev-listno debería devolver nada.

git rev-list --boundary A..B

terminaría en A, si Aes accesible desde B.
Es lo mismo que:

git rev-list --boundary B --not A

, con Buna referencia positiva y Auna referencia negativa .
Comenzará en By retrocederá a través del gráfico hasta encontrar una revisión a la que se pueda acceder desde A.
Yo diría que si Ase puede acceder directamente desde B, se encontrará (y se mostrará, debido a la --boundaryopción) Amismo.

VonC avatar Jun 09 '2010 13:06 VonC