İlk kullanım git remote update
, uzaktan referanslarınızı güncel hale getirmek için. Ardından, aşağıdakilerden biri gibi birkaç şeyden birini yapabilirsiniz:
git status -uno
izlediğiniz dalın önde mi, arkasında mı yoksa ayrışmış mı olduğunu size bildirir. Hiçbir şey söylemiyorsa, yerel ve uzak aynıdır.
git show-branch *master
isimleri 'master' ile biten tüm şubelerde (örn. master ve orijin / master ) taahhütleri gösterecektir .
Eğer kullanırsanız -v
ile git remote update
( git remote -v update
eğer gerçekten başka komutları gerekmez) Eğer dalları güncellenmiş var olduğunu görebilirsiniz.
Ancak, bunu bir komut dosyasında veya programda yapmak ve doğru / yanlış değeriyle sonuçlanmak istediğiniz gibi görünüyor. Öyleyse, mevcut HEAD taahhüdünüz ile izlediğiniz şubenin başı arasındaki ilişkiyi kontrol etmenin yolları vardır , ancak dört olası sonuç olduğundan, evet / hayır cevabına indirgeyemezsiniz. Ancak, bir yapmaya hazırsanız pull --rebase
, "yerel arkasında" ve "yerel" çekmek zorunda "olarak, diğer iki" çekmek gerek yok "olarak tedavi edebilirsiniz.
Bunu kullanarak herhangi bir ref'nin taahhüt kimliğini alabilirsiniz git rev-parse <ref>
, böylece bunu master ve origin / master için yapabilir ve karşılaştırabilirsiniz. Eşitlerse, dallar aynıdır. Eşit değilse, hangisinin diğerinin önünde olduğunu bilmek istersiniz. Kullanmak git merge-base master origin/master
size her iki dalın ortak atalarını söyleyecektir ve eğer ayrılmamışlarsa, bu biri veya diğeri ile aynı olacaktır. Üç farklı kimlik alırsanız, dallar birbirinden ayrılmıştır.
Bunu düzgün bir şekilde yapmak için, örneğin bir komut dosyasında, geçerli dalı ve izlediği uzak dalı ifade edebilmeniz gerekir. İçindeki bash istemi ayarlama işlevi, /etc/bash_completion.d
şube adlarını almak için bazı yararlı kodlara sahiptir. Ancak, muhtemelen isimleri almanıza gerek yoktur. Git'in şube ve taahhütlere atıfta bulunmak için bazı düzgün kısayolları vardır (belgelendiği gibi git rev-parse --help
). Özellikle, @
mevcut dal için (bağımsız bir durumda olmadığınız varsayılarak) ve @{u}
yukarı akış dalında (örneğin origin/master
) kullanabilirsiniz. Yani git merge-base @ @{u}
(karmasını) geri geldiğini şimdiki şube ve upstream ıraksar ve taahhüt edecek git rev-parse @
ve git rev-parse @{u}
siz iki ipuçları karmaları verecektir. Bu, aşağıdaki komut dosyasında özetlenebilir:
#!/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
Not: git'in eski sürümleri @
kendi başına izin vermediğinden , bunun @{0}
yerine kullanmanız gerekebilir .
UPSTREAM=${1:-'@{u}'}
Geçerli dal için yapılandırılmış olandan farklı bir uzak dal ile karşılaşmak istemeniz durumunda, çizgi isteğe bağlı olarak yukarı akış dalını açıkça geçirmenize izin verir. Bu genellikle remotename / branchname biçimindedir . Herhangi bir parametre verilmezse, değer varsayılan olarak kullanılır @{u}
.
Komut dosyası , izleme dallarını güncelleştirmek için bir git fetch
veya git remote update
ilk yaptığınızı varsayar . Bunu betiğin içine inşa etmedim, çünkü getirme ve karşılaştırmayı ayrı işlemler olarak yapabilmek daha esnek, örneğin zaten yakın zamanda getirdiğiniz için getirme olmadan karşılaştırmak istiyorsanız.