¿Cómo puedo saber si una confirmación es descendiente de otra confirmación?
Con Git, ¿cómo puedo saber si una confirmación en mi rama es descendiente de otra confirmación?
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 $?
Si desea verificar esto mediante programación (por ejemplo, en un script), puede verificar si git merge-base A B
es 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-parse
Aquí 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-list
Me 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.
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-list
deberí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-list
comando, 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-list
no debería devolver nada.
git rev-list --boundary A..B
terminaría en A
, si A
es accesible desde B
.
Es lo mismo que:
git rev-list --boundary B --not A
, con B
una referencia positiva y A
una referencia negativa .
Comenzará en B
y 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 A
se puede acceder directamente desde B
, se encontrará (y se mostrará, debido a la --boundary
opción) A
mismo.