Verwenden git remote update
Sie diese Option zuerst , um Ihre Remote-Refs auf den neuesten Stand zu bringen. Dann können Sie eines von mehreren Dingen tun, wie zum Beispiel:
git status -uno
wird Ihnen sagen, ob der Zweig, den Sie verfolgen, vor, hinter oder divergiert. Wenn nichts gesagt wird, sind lokal und remote identisch.
git show-branch *master
zeigt Ihnen die Commits in allen Zweigen, deren Namen auf 'master' enden (z. B. master und origin / master ).
Wenn Sie -v
mit git remote update
( git remote -v update
) verwenden, können Sie sehen, welche Zweige aktualisiert wurden, sodass Sie keine weiteren Befehle benötigen.
Es sieht jedoch so aus, als ob Sie dies in einem Skript oder Programm tun möchten und am Ende einen True / False-Wert erhalten möchten. In diesem Fall gibt es Möglichkeiten, die Beziehung zwischen Ihrem aktuellen HEAD- Commit und dem Leiter des von Ihnen verfolgten Zweigs zu überprüfen. Da es jedoch vier mögliche Ergebnisse gibt, können Sie diese nicht auf eine Ja / Nein-Antwort reduzieren. Wenn Sie jedoch bereit sind, eine pull --rebase
Aktion auszuführen, können Sie "lokal ist hinterher" und "lokal ist divergiert" als "ziehen müssen" und die anderen beiden als "nicht ziehen" behandeln.
Sie können die Commit-ID jeder Referenz mit abrufen git rev-parse <ref>
, also können Sie dies für Master und Origin / Master tun und diese vergleichen. Wenn sie gleich sind, sind die Zweige gleich. Wenn sie ungleich sind, möchten Sie wissen, welche vor den anderen liegt. Mit git merge-base master origin/master
wird Ihnen der gemeinsame Vorfahr beider Zweige angezeigt. Wenn diese nicht voneinander abweichen, ist dies derselbe wie der eine oder andere. Wenn Sie drei verschiedene IDs erhalten, sind die Zweige auseinander gegangen.
Um dies richtig zu tun, z. B. in einem Skript, müssen Sie in der Lage sein, auf den aktuellen Zweig und den Remote-Zweig zu verweisen, den er verfolgt. Die Funktion zum Einstellen der Bash-Eingabeaufforderung in /etc/bash_completion.d
enthält nützlichen Code zum Abrufen von Zweigstellennamen. Allerdings müssen Sie die Namen wahrscheinlich nicht wirklich erhalten. Git hat einige nette Abkürzungen für den Verweis auf Zweige und Commits (wie in dokumentiert git rev-parse --help
). Insbesondere können Sie @
für den aktuellen Zweig (vorausgesetzt, Sie befinden sich nicht in einem Zustand mit getrenntem Kopf) und @{u}
für den vorgelagerten Zweig (z origin/master
. B. ) verwenden. So git merge-base @ @{u}
kehrt die (Hash - Wert des) begehen , an dem die Stromzweig und seine Upstream - divergieren und git rev-parse @
und git rev-parse @{u}
sehen Sie die Hashes der beiden Tipps geben. Dies kann im folgenden Skript zusammengefasst werden:
#!/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
Hinweis: Ältere Versionen von git waren für sich genommen nicht zulässig @
, daher müssen Sie möglicherweise @{0}
stattdessen verwenden.
Über die Leitung UPSTREAM=${1:-'@{u}'}
können Sie optional einen Upstream-Zweig explizit übergeben, falls Sie einen anderen Remote-Zweig als den für den aktuellen Zweig konfigurierten vergleichen möchten. Dies hat normalerweise die Form Remotename / Branchname . Wenn kein Parameter angegeben wird, wird standardmäßig der Wert verwendet @{u}
.
Das Skript setzt voraus, dass Sie eine git fetch
oder die git remote update
erste Option ausgeführt haben , um die Tracking-Zweige auf den neuesten Stand zu bringen. Ich habe dies nicht in das Skript integriert, da es flexibler ist, das Abrufen und Vergleichen als separate Operationen durchzuführen, z. B. wenn Sie vergleichen möchten, ohne abzurufen, da Sie bereits kürzlich abgerufen haben.