Erste Verwendung git remote update
, um Ihre Fernreferenten auf den neuesten Stand zu bringen. Dann können Sie eines von mehreren Dingen tun, z. B:
-
git status -uno
zeigt Ihnen an, ob der verfolgte Zweig vor oder hinter Ihnen liegt oder abgewichen ist. Wenn nichts angezeigt wird, sind der lokale und der entfernte Zweig identisch.
-
git show-branch *master
zeigt Ihnen die Übertragungen in allen Zweigen, deren Namen auf 'master' enden (z.B. Meister y Ursprung/Master ).
を使用する場合 -v
con git remote update
( git remote -v update
) können Sie sehen, welche Zweige aktualisiert wurden, so dass Sie eigentlich keine weiteren Befehle benötigen.
Es sieht jedoch so aus, als ob Sie dies in einem Skript oder Programm tun wollen und am Ende einen true/false-Wert erhalten. Wenn dem so ist, gibt es Möglichkeiten, die Beziehung zwischen Ihrem aktuellen KOPF commit und dem Leiter des Zweigs, den Sie verfolgen, obwohl man das nicht auf eine Ja/Nein-Antwort reduzieren kann, da es vier mögliche Ergebnisse gibt. Wenn Sie jedoch bereit sind, eine pull --rebase
dann können Sie "local is behind" und "local has diverged" als "need to pull" behandeln, und die anderen beiden ("local is ahead" und "same") als "don't need to pull".
Sie können die Commit-ID einer beliebigen Referenz mit git rev-parse <ref>
so können Sie dies tun für Meister y Ursprung/Master und vergleichen sie. Wenn sie gleich sind, sind die Zweige identisch. Wenn sie ungleich sind, wollen Sie wissen, welcher vor dem anderen liegt. verwenden git merge-base master origin/master
gibt den gemeinsamen Vorfahren der beiden Zweige an, und wenn sie sich nicht auseinanderentwickelt haben, ist dies derselbe wie bei dem einen oder dem anderen Zweig. Wenn Sie drei verschiedene IDs erhalten, haben sich die Zweige auseinanderentwickelt.
Um dies richtig zu tun, z.B. in einem Skript, müssen Sie in der Lage sein, sich auf den aktuellen Zweig und den entfernten Zweig zu beziehen, den er verfolgt. Die Funktion bash prompt-setting in /etc/bash_completion.d
enthält nützlichen Code, um Zweignamen zu ermitteln. Wahrscheinlich brauchen Sie die Namen aber gar nicht zu ermitteln. Git hat ein paar nette Abkürzungen, um auf Zweige und Übertragungen zu verweisen (wie dokumentiert in git rev-parse --help
). Sie können insbesondere Folgendes verwenden @
für den aktuellen Zweig (vorausgesetzt, Sie befinden sich nicht in einem abgetrennten Kopfzustand) und @{u}
für seinen vorgelagerten Zweig (z. B. origin/master
). Also git merge-base @ @{u}
gibt den (Hash des) Commits zurück, an dem der aktuelle Zweig und sein Upstream auseinanderlaufen und git rev-parse @
y git rev-parse @{u}
erhalten Sie die Hashes der beiden Tipps. Dies lässt sich in dem folgenden Skript zusammenfassen:
#!/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
Anmerkung: ältere Versionen von Git erlaubten nicht @
selbständig, daher müssen Sie möglicherweise @{0}
stattdessen.
Die Linie UPSTREAM=${1:-'@{u}'}
ermöglicht es Ihnen, einen Upstream-Zweig explizit zu übergeben, falls Sie gegen einen anderen entfernten Zweig als den für den aktuellen Zweig konfigurierten prüfen wollen. Dies würde typischerweise in der folgenden Form geschehen entfernter Name/Branchenname . Wenn kein Parameter angegeben wird, ist der Wert standardmäßig @{u}
.
Das Skript geht davon aus, dass Sie eine git fetch
o git remote update
Zunächst müssen die Verfolgungszweige auf den neuesten Stand gebracht werden. Ich habe dies nicht in das Skript eingebaut, weil es flexibler ist, den Abruf und den Vergleich als getrennte Operationen durchzuführen, z. B. wenn Sie ohne Abruf vergleichen wollen, weil Sie bereits vor kurzem abgerufen haben.
16 Stimmen
Bitte beachten Sie: "git pull --dry-run" funktioniert nicht so, wie vermutlich erwartet. Es scheint, dass git pull unbekannte Optionen direkt an git fetch weitergibt. Das Ergebnis ist das eines normalen git pull.
34 Stimmen
"pull" ist nur ein kurzer Weg, um "fetch" und "merge" auf einmal zu machen, wenn Sie den Status der entfernten Repo überprüfen müssen, simulieren Sie wirklich ein "fetch". Also
git fetch -v --dry-run
ist das, was Sie brauchen.0 Stimmen
Ich habe die von OP vorgeschlagene Lösung ausprobiert, und es hat nichts gebracht. Wahrscheinlich nicht der beste Ansatz?