最初にを使用git remote update
して、リモート参照を最新の状態にします。その後、次のようないくつかのことを実行できます。
git status -uno
あなたが追跡しているブランチが前にあるのか、後ろにあるのか、分岐しているのかを教えてくれます。何も表示されない場合、ローカルとリモートは同じです。
git show-branch *master
名前が「master」で終わるすべてのブランチ(例:masterおよびorigin / master)のコミットが表示されます。
()-v
と一緒に使用すると、更新されたブランチを確認できるため、それ以上コマンドを実行する必要はありません。git remote update
git remote -v update
ただし、スクリプトまたはプログラムでこれを実行し、true / false値で終了するように見えます。その場合は、現在のHEADコミットと追跡しているブランチのヘッドとの関係を確認する方法がありますが、4つの結果が考えられるため、はい/いいえの回答に減らすことはできません。ただし、準備ができているpull --rebase
場合は、「ローカルが遅れている」と「ローカルが分岐している」を「プルする必要がある」、他の2つを「プルする必要がない」として扱うことができます。
を使用して任意の参照のコミットIDを取得できるため、マスターとorigin / masterでgit rev-parse <ref>
これを実行して、それらを比較できます。それらが等しい場合、ブランチは同じです。それらが等しくない場合は、どちらが先行しているかを知りたいです。を使用すると、両方のブランチの共通の祖先がわかります。分岐していない場合、これはどちらか一方と同じになります。3つの異なるIDを取得した場合、ブランチは分岐しています。git merge-base master origin/master
これをスクリプトなどで適切に行うには、現在のブランチと、それが追跡しているリモートブランチを参照できる必要があります。のbashプロンプト設定関数に/etc/bash_completion.d
は、ブランチ名を取得するための便利なコードがいくつかあります。ただし、おそらく実際に名前を取得する必要はありません。Gitには、ブランチとコミットを参照するための簡潔な省略形があります(に記載されていますgit rev-parse --help
)。特に、@
現在のブランチ(分離ヘッド状態ではない場合)と@{u}
その上流のブランチ(などorigin/master
)に使用できます。だから、git merge-base @ @{u}
(のハッシュ)は、現在のブランチとその上流発散れるコミットと戻りますgit rev-parse @
と、git rev-parse @{u}
次の2つのヒントのハッシュを与えるだろう。これは、次のスクリプトで要約できます。
#!/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
注:古いバージョンのgitは@
それ自体では許可されていないため、@{0}
代わりに使用する必要があります。
この行でUPSTREAM=${1:-'@{u}'}
は、現在のブランチに構成されているものとは異なるリモートブランチに対してチェックする場合に備えて、オプションで上流のブランチを明示的に渡すことができます。これは通常、remotename / branchnameの形式になります。パラメータを指定しない場合、値はデフォルトでになり@{u}
ます。
このスクリプトでは、追跡ブランチを最新の状態にするために、git fetch
またはgit remote update
最初に完了したと想定しています。これをスクリプトに組み込んだのは、フェッチと比較を個別の操作として実行できるため、たとえば最近フェッチしたためフェッチせずに比較したい場合など、より柔軟であるためです。