Lo que estoy tratando de hacer es un control de versiones. Quiero asegurarme de que el código se mantiene sobre una versión mínima. Así que necesito una manera de saber si la rama actual contiene un commit especificado.
Hay varias formas de conseguir este resultado. La primera opción ingenua es usar git log
y buscar un commit específico usando grep
, pero eso no siempre es preciso
git log | grep <commit_id>
Es mejor usar git branch
directamente para encontrar todas las ramas que contengan un determinado COMMIT_ID
usando
git branch --contains $COMMIT_ID
El siguiente paso es encontrar la rama actual, lo que puede hacerse desde git 1.8.1
usando
git symbolic-ref --short HEAD
Y combinado como
git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID
Pero el comando anterior no devuelve verdadero o falso y hay una versión más corta que devuelve el código de salida 0 si el commit está en la rama actual O el código de salida 1 si no lo está
git merge-base --is-ancestor $COMMIT_ID HEAD
El código de salida está bien, pero como quieres la cadena true
o false
como respuesta necesitas añadir un poco más y entonces combinado con if
de bash obtienes
if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
Obtiene una lista de ramas que contienen la confirmación específica.
# get all the branches where the commit exists
$ git branch --contains <commit-id>
Comprueba si una rama tiene la confirmación específica.
# output the branch-name if the commit exists in that branch
$ git branch --contains <commit-id> | grep <branch-name>
Busca en la rama (digamos, feature
) con exact matching.
$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'
**Por ejemplo, si tienes 3 ramas locales llamadas feature
, feature1
, feature2
entonces
$ git branch --contains <commit-id> | grep 'feature'
# output
feature
feature1
feature2
$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'
# output
feature
También puedes buscar en las ramas local
y remote
(usa -a
) o sólo en las ramas remote
(usa -r
).
# search in both 'local' & 'remote' branches
$ git branch -a --contains <commit-id> | grep -E '(^|\s)feature$'
# search in 'remote' branches
$ git branch -r --contains <commit-id> | grep -E '(^|\s)feature$'