Primer uso git remote update
, para actualizar sus referencias remotas. Luego puede hacer una de varias cosas, como:
git status -uno
le 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 *master
le mostrará las confirmaciones en todas las ramas cuyos nombres terminan en 'maestro' (por ejemplo, maestro y origen / maestro ).
Si usa -v
con 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 --rebase
ejercicio, 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/master
le 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.d
tiene 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 fetch
o git remote update
primero, 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.