Primer uso git remote update, para actualizar sus referencias remotas. Luego puede hacer una de varias cosas, como:
git status -unole dirá si la rama que está rastreando está adelante, atrás o ha divergido. Si no dice nada, lo local y lo remoto son lo mismo.
git show-branch *masterle mostrará las confirmaciones en todas las ramas cuyos nombres terminan en 'maestro' (por ejemplo, maestro y origen / maestro ).
Si usa -vcon git remote update( git remote -v update) puede ver qué ramas se actualizaron, por lo que realmente no necesita más comandos.
Sin embargo, parece que desea hacer esto en un script o programa y terminar con un valor verdadero / falso. Si es así, hay formas de verificar la relación entre su compromiso HEAD actual y el jefe de la rama que está rastreando, aunque dado que hay cuatro resultados posibles, no puede reducirlo a una respuesta sí / no. Sin embargo, si está preparado para hacer un pull --rebaseejercicio, entonces puede tratar "lo local está detrás" y "lo local ha divergido" como "necesidad de tirar", y los otros dos como "no es necesario tirar".
Puede obtener la identificación de confirmación de cualquier referencia usando git rev-parse <ref>, por lo que puede hacer esto para master y origin / master y compararlos. Si son iguales, las ramas son iguales. Si son desiguales, desea saber cuál está por delante del otro. El uso git merge-base master origin/masterle dirá el antepasado común de ambas ramas, y si no han divergido, será lo mismo que una u otra. Si obtienes tres identificadores diferentes, las ramas se han separado.
Para hacerlo correctamente, por ejemplo, en un script, debe poder hacer referencia a la rama actual y a la rama remota que está rastreando. La función bash prompt-setting /etc/bash_completion.dtiene un código útil para obtener nombres de sucursales. Sin embargo, probablemente no necesite obtener los nombres. Git tiene algunas ordenadas shorthands para referirse a ramas y commits (como se documenta en git rev-parse --help). En particular, puede usarlo @para la rama actual (suponiendo que no esté en un estado de cabeza separada) y @{u}para su rama ascendente (por ejemplo origin/master). Por git merge-base @ @{u}lo tanto , devolverá el (hash del) commit en el que la rama actual y su flujo ascendente divergen git rev-parse @y git rev-parse @{u}le dará los hash de los dos consejos. Esto se puede resumir en el siguiente script:
#!/bin/sh
UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")
if [ $LOCAL = $REMOTE ]; then
echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
echo "Need to push"
else
echo "Diverged"
fi
Nota: las versiones anteriores de git no permitían @por sí mismas, por lo que es posible que deba usarlas @{0}.
La línea le UPSTREAM=${1:-'@{u}'}permite opcionalmente pasar una rama ascendente explícitamente, en caso de que desee verificar con una rama remota diferente a la configurada para la rama actual. Esto normalmente sería de la forma remotename / branchname . Si no se proporciona ningún parámetro, el valor predeterminado es @{u}.
La secuencia de comandos asume que has hecho uno git fetcho git remote updateprimero, para actualizar las ramas de seguimiento. No incluí esto en el script porque es más flexible poder realizar la recuperación y la comparación como operaciones separadas, por ejemplo, si desea comparar sin recuperar porque ya obtuvo recientemente.