Première utilisation git remote update
, pour mettre à jour vos références de télécommande. Ensuite, vous pouvez effectuer plusieurs opérations, telles que:
git status -uno
vous dira si la branche que vous suivez est devant, derrière ou a divergé. S'il ne dit rien, le local et le distant sont les mêmes.
git show-branch *master
vous montrera les commits dans toutes les branches dont les noms se terminent par «master» (par exemple master et origin / master ).
Si vous utilisez -v
avec git remote update
( git remote -v update
), vous pouvez voir quelles branches ont été mises à jour, vous n'avez donc pas vraiment besoin d'autres commandes.
Cependant, il semble que vous souhaitiez le faire dans un script ou un programme et vous retrouver avec une valeur vraie / fausse. Dans l'affirmative, il existe des moyens de vérifier la relation entre votre validation HEAD actuelle et le chef de la branche que vous suivez, bien qu'il existe quatre résultats possibles, vous ne pouvez pas la réduire à une réponse oui / non. Cependant, si vous êtes prêt à le faire, pull --rebase
vous pouvez traiter "local is behind" et "local has diverged" comme "need to pull", et les deux autres comme "don't need to pull".
Vous pouvez obtenir l'ID de validation de n'importe quelle référence en utilisant git rev-parse <ref>
, vous pouvez donc le faire pour master et origin / master et les comparer. S'ils sont égaux, les branches sont les mêmes. S'ils sont inégaux, vous voulez savoir ce qui est en avance sur l'autre. L'utilisation git merge-base master origin/master
vous indiquera l'ancêtre commun des deux branches, et si elles n'ont pas divergé, ce sera la même chose que l'une ou l'autre. Si vous obtenez trois identifiants différents, les branches ont divergé.
Pour le faire correctement, par exemple dans un script, vous devez être en mesure de vous référer à la branche actuelle et à la branche distante qu'elle suit. La fonction de configuration d'invite bash dans /etc/bash_completion.d
contient du code utile pour obtenir les noms de branche. Cependant, vous n'avez probablement pas besoin d'obtenir les noms. Git a quelques raccourcis pour faire référence aux branches et commits (comme documenté dans git rev-parse --help
). En particulier, vous pouvez utiliser @
pour la branche actuelle (en supposant que vous n'êtes pas dans un état de tête détachée) et @{u}
pour sa branche en amont (par exemple origin/master
). Ainsi git merge-base @ @{u}
retournera le (hachage du) commit auquel la branche courante et son amont divergent et git rev-parse @
et git rev-parse @{u}
vous donnera les hachages des deux astuces. Cela peut être résumé dans le script suivant:
#!/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
Remarque: les anciennes versions de git ne le permettaient pas @
, vous devrez donc peut-être utiliser à la @{0}
place.
La ligne UPSTREAM=${1:-'@{u}'}
vous permet éventuellement de passer explicitement une branche en amont, au cas où vous voudriez comparer avec une branche distante différente de celle configurée pour la branche actuelle. Il s'agit généralement de la forme nom distant / nom de branche . Si aucun paramètre n'est donné, la valeur par défaut est @{u}
.
Le script suppose que vous avez fait une git fetch
ou une git remote update
première pour mettre à jour les branches de suivi. Je n'ai pas intégré cela dans le script car il est plus flexible de pouvoir faire la récupération et la comparaison en tant qu'opérations distinctes, par exemple si vous voulez comparer sans récupérer car vous avez déjà récupéré récemment.