Pierwsze użycie git remote update
, aby zaktualizować swoje zdalne referencje. Następnie możesz zrobić jedną z kilku rzeczy, takich jak:
git status -uno
poinformuje Cię, czy gałąź, którą śledzisz, znajduje się przed, za czy może się rozdzieliła. Jeśli nic nie mówi, lokalne i zdalne są takie same.
git show-branch *master
pokaże zatwierdzenia we wszystkich gałęziach, których nazwy kończą się na „master” (np. master i origin / master ).
Jeśli używasz -v
z git remote update
( git remote -v update
), możesz zobaczyć, które gałęzie zostały zaktualizowane, więc tak naprawdę nie potrzebujesz żadnych dalszych poleceń.
Wygląda jednak na to, że chcesz to zrobić w skrypcie lub programie i uzyskać wartość prawda / fałsz. Jeśli tak, istnieją sposoby na sprawdzenie związku między twoim bieżącym zatwierdzeniem HEAD a szefem śledzonego oddziału, chociaż ponieważ są cztery możliwe wyniki, nie możesz zredukować go do odpowiedzi tak / nie. Jeśli jednak jesteś gotowy, aby to zrobićpull --rebase
tego, możesz traktować „lokalny jest za”, a „lokalny jest rozbieżny” jako „trzeba ciągnąć”, a pozostałe dwa jako „nie trzeba ciągnąć”.
Możesz uzyskać identyfikator zatwierdzenia dowolnego używanego ref git rev-parse <ref>
, więc możesz to zrobić dla master i origin / master i porównać je. Jeśli są równe, gałęzie są takie same. Jeśli są nierówne, chcesz wiedzieć, co jest przed sobą. Użycie git merge-base master origin/master
powie ci wspólnego przodka obu gałęzi, a jeśli się nie rozejdą, będzie to to samo, co jedno lub drugie. Jeśli otrzymasz trzy różne identyfikatory, gałęzie się rozeszły.
Aby to zrobić poprawnie, np. W skrypcie, musisz mieć możliwość odniesienia do bieżącej gałęzi, a gałąź zdalna śledzi ją. Funkcja ustawiania znaku zachęty w bash /etc/bash_completion.d
zawiera użyteczny kod do pobierania nazw oddziałów. Jednak prawdopodobnie nie potrzebujesz nazwisk. Git ma kilka schludnych skrótów do odwoływania się do gałęzi i zatwierdzeń (jak udokumentowano w git rev-parse --help
). W szczególności możesz użyć @
dla bieżącej gałęzi (zakładając, że nie jesteś w stanie odłączonym) i @{u}
dla jej gałęzi upstream (np origin/master
.). Zwróci więc git merge-base @ @{u}
(mieszanie) zatwierdzenie, w którym rozbieżność obecnego odgałęzienia i jego górnego biegu, git rev-parse @
i git rev-parse @{u}
da ci skróty dwóch wskazówek. Można to streścić w następującym skrypcie:
#!/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
Uwaga: starsze wersje git nie pozwalały @
same, więc może być konieczne użycie @{0}
zamiast tego.
Linia UPSTREAM=${1:-'@{u}'}
pozwala opcjonalnie przekazać jawnie gałąź nadrzędną, na wypadek, gdybyś chciał sprawdzić inną gałąź zdalną niż ta skonfigurowana dla bieżącej gałęzi. Zwykle ma to postać remotename / branchname . Jeśli nie podano żadnego parametru, wartością domyślną jest @{u}
.
Skrypt zakłada, że zrobiłeś pierwszy git fetch
lub git remote update
pierwszy, aby zaktualizować gałęzie śledzące. Nie wbudowałem tego w skrypt, ponieważ jest bardziej elastyczne, aby móc pobierać i porównywać jako osobne operacje, na przykład jeśli chcesz porównać bez pobierania, ponieważ ostatnio został pobrany.