Primo utilizzo git remote update
, per aggiornare i riferimenti remoti. Quindi puoi fare una delle diverse cose, come ad esempio:
git status -uno
ti dirà se il ramo che stai seguendo è avanti, indietro o divergente. Se non dice nulla, locale e remoto sono uguali.
git show-branch *master
ti mostrerà i commit in tutte le filiali i cui nomi finiscono in "master" (ad esempio master e origin / master ).
Se usi -v
con git remote update
( git remote -v update
) puoi vedere quali rami sono stati aggiornati, quindi non hai davvero bisogno di ulteriori comandi.
Tuttavia, sembra che tu voglia farlo in uno script o in un programma e finire con un valore vero / falso. In tal caso, ci sono modi per verificare la relazione tra il tuo attuale HEAD commit e il responsabile del ramo che stai monitorando, anche se poiché ci sono quattro possibili risultati non puoi ridurlo a una risposta sì / no. Tuttavia, se sei pronto a farlo pull --rebase
, puoi considerare "local is behind" e "local is diverged" come "bisogno di tirare", e gli altri due come "non hanno bisogno di tirare".
È possibile ottenere l'id di commit di qualsiasi riferimento usando git rev-parse <ref>
, quindi è possibile farlo per master e origin / master e confrontarli. Se sono uguali, i rami sono gli stessi. Se sono disuguali, vuoi sapere quale è davanti all'altro. L'utilizzo git merge-base master origin/master
ti dirà l'antenato comune di entrambi i rami e se non sono divergenti sarà lo stesso dell'uno o dell'altro. Se ottieni tre ID diversi, i rami sono divergenti.
Per farlo correttamente, ad esempio in uno script, devi essere in grado di fare riferimento al ramo corrente e al ramo remoto che sta monitorando. La funzione di impostazione del prompt di bash in /etc/bash_completion.d
ha del codice utile per ottenere i nomi dei rami. Tuttavia, probabilmente non è necessario effettivamente ottenere i nomi. Git ha alcune scorciatoie per fare riferimento a filiali e commit (come documentato in git rev-parse --help
). In particolare, puoi usarlo @
per il ramo corrente (supponendo che tu non sia in uno stato a testa staccata) e @{u}
per il suo ramo a monte (ad es origin/master
.). Quindi git merge-base @ @{u}
restituirà il (hash of the) commit in cui divergono il ramo corrente e il suo upstream git rev-parse @
e git rev-parse @{u}
ti darà gli hash dei due suggerimenti. Questo può essere riassunto nel seguente 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: le versioni precedenti di git non lo consentivano @
da sole, quindi potrebbe essere necessario utilizzare @{0}
invece.
La linea UPSTREAM=${1:-'@{u}'}
consente facoltativamente di passare esplicitamente un ramo a monte, nel caso in cui si desideri verificare un ramo remoto diverso da quello configurato per il ramo corrente. Questo sarebbe in genere nel formato remotename / branchname . Se non viene fornito alcun parametro, il valore predefinito è @{u}
.
Lo script presuppone che tu abbia fatto una git fetch
o git remote update
prima, per aggiornare i rami di tracciamento. Non ho inserito questo nello script perché è più flessibile poter eseguire il recupero e il confronto come operazioni separate, ad esempio se si desidera confrontare senza recuperare perché hai già recuperato di recente.