En el siguiente árbol de ejemplo:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
Estoy buscando F: la primera confirmación en la rama xxx. Creo que es posible con:
git log xxx --not master
y la última confirmación en la lista debería ser F. ¿Es la solución correcta o tal vez tiene algunas desventajas?
Sé que hubo preguntas similares sobre stackoverflow, pero nadie propuso tal solución, y no estoy seguro de si lo hago bien.
Respuestas:
Donde "rama" es su nombre de rama específico. El punto-punto le da todas las confirmaciones que tiene la rama y que el maestro no tiene.
tail -1
devuelve la última línea de la salida anterior.fuente
master
, y siempre que su bifurcación no haya sido eliminada,git log <sha>..branch --oneline | tail -1
aún debería brindarle los resultados que está buscando.--reverse
para leer los registros al revés con colores, etc.Debe utilizar la
merge-base
funcionalidad que está diseñada para resolver exactamente esto:fuente
fuente
Si su rama (la anterior) una vez más se fusionó con la maestra no da el resultado esperado, estoy usando el script de Python para encontrar el ID de confirmación de la rama inicial.
git rev-list: conjunto de cambios del primer padre
--first-parent sigue solo a la primera confirmación principal al ver una confirmación de fusión.
Itere el conjunto de cambios del comando anterior hasta que se encuentre la rama principal.
fuente
sin embargo, esto solo le dará la primera confirmación en la rama xxx que no está en el maestro, no la primera confirmación en la rama xxx. esto último sería difícil si la rama xxx se ha eliminado y / o vuelto a crear una o más veces. en ese caso, puede intentar lo siguiente:
fuente
head -n 1
lugar detail -1
?tail -1
devuelve la confirmación más reciente en lugar de la primera.Probé este comando y funcionó:
fuente
git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
fuente