git remote update
pour mettre à jour vos arbitres à distance. Ensuite, vous pouvez faire l'une des nombreuses choses suivantes :
-
git status -uno
vous indiquera si la branche que vous suivez est en avance, en retard 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 le nom se termine par master (par exemple master et origin/master).
Si vous utilisez -v
avec git remote update
vous pouvez voir quelles branches ont été mises à jour, donc vous n'avez pas vraiment besoin d'autres commandes.
Cependant, il semble que vous vouliez faire cela dans un script ou un programme et vous retrouver avec une valeur vrai/faux. Si c'est le cas, il existe des moyens de vérifier la relation entre votre commit HEAD actuel et la tête de la branche que vous suivez, bien que, puisqu'il y a quatre résultats possibles, vous ne pouvez pas le réduire à une réponse oui/non. Cependant, si vous êtes prêt à faire un pull --rebase
on peut alors considérer que " la section locale est en retard " et " la section locale a divergé " comme " il faut tirer ", et les deux autres comme " il ne faut pas tirer ".
Vous pouvez obtenir l'identifiant de commit de n'importe quelle référence en utilisant git rev-parse <ref>
Vous pouvez donc effectuer cette opération pour master et origin/master et les comparer. S'ils sont égaux, les branches sont les mêmes. Si elles sont inégales, vous voulez savoir laquelle est en avance sur l'autre. Utilisation de git merge-base master origin/master
vous indiquera l'ancêtre commun des deux branches, et si elles n'ont pas divergé, ce sera le même que l'une ou l'autre. Si vous obtenez trois identifiants différents, les branches ont divergé.
Pour faire cela correctement, par exemple dans un script, vous devez être en mesure de faire référence à la branche actuelle et à la branche distante qu'elle suit. La fonction bash prompt-setting dans /etc/bash_completion.d
contient du code utile pour obtenir les noms des branches. Cependant, vous n'avez probablement pas besoin d'obtenir ces noms. Git dispose de quelques raccourcis pour se référer aux branches et aux commits (comme documenté dans le fichier 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 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 @
y git rev-parse @{u}
vous donnera les hachages des deux conseils. Ceci peut être résumé dans le script suivant :
#!/bin/sh
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse @{u})
BASE=$(git merge-base @ @{u})
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