Pertama kali digunakan git remote update
, untuk memperbaharui referensi jarak jauh Anda. Maka Anda dapat melakukan salah satu dari beberapa hal, seperti:
git status -uno
akan memberi tahu Anda apakah cabang yang Anda lacak ada di depan, di belakang atau telah menyimpang. Jika tidak mengatakan apa-apa, lokal dan remote adalah sama.
git show-branch *master
akan menunjukkan kepada Anda komit di semua cabang yang namanya berakhiran 'master' (mis. master dan asal / master ).
Jika Anda menggunakan -v
dengan git remote update
( git remote -v update
) Anda dapat melihat cabang mana yang diperbarui, sehingga Anda tidak benar-benar membutuhkan perintah lebih lanjut.
Namun, sepertinya Anda ingin melakukan ini dalam skrip atau program dan berakhir dengan nilai true / false. Jika demikian, ada cara untuk memeriksa hubungan antara komit HEAD Anda saat ini dan kepala cabang yang Anda lacak, meskipun karena ada empat kemungkinan hasil yang Anda tidak bisa menguranginya menjadi jawaban ya / tidak. Namun, jika Anda siap untuk melakukannya pull --rebase
maka Anda dapat memperlakukan "lokal ada di belakang" dan "lokal telah menyimpang" sebagai "perlu menarik", dan dua lainnya sebagai "tidak perlu menarik".
Anda bisa mendapatkan id komit dari setiap referensi yang menggunakan git rev-parse <ref>
, sehingga Anda bisa melakukan ini untuk master dan origin / master dan membandingkannya. Jika mereka sama, cabang-cabangnya sama. Jika mereka tidak setara, Anda ingin tahu yang di depan yang lain. Menggunakan git merge-base master origin/master
akan memberi tahu Anda nenek moyang yang sama dari kedua cabang, dan jika mereka tidak menyimpang ini akan sama dengan yang satu atau yang lainnya. Jika Anda mendapatkan tiga id berbeda, cabang-cabangnya telah berbeda.
Untuk melakukan ini dengan benar, misalnya dalam skrip, Anda harus dapat merujuk ke cabang saat ini, dan cabang jarak jauh yang dilacaknya. Fungsi bash prompt-setting di /etc/bash_completion.d
memiliki beberapa kode yang berguna untuk mendapatkan nama cabang. Namun, Anda mungkin sebenarnya tidak perlu mendapatkan namanya. Git memiliki beberapa singkatan yang rapi untuk merujuk pada cabang dan komitmen (seperti yang didokumentasikan dalam git rev-parse --help
). Secara khusus, Anda dapat menggunakan @
untuk cabang saat ini (dengan asumsi Anda tidak berada dalam keadaan kepala terpisah) dan @{u}
untuk cabang hulu (misalnya origin/master
). Jadi git merge-base @ @{u}
akan mengembalikan (hash dari) komit di mana cabang saat ini dan hulu berbeda dan git rev-parse @
dan git rev-parse @{u}
akan memberi Anda hash dari dua tips. Ini dapat diringkas dalam skrip berikut:
#!/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
Catatan: git versi lama tidak mengizinkannya @
sendiri, jadi Anda mungkin harus menggunakannya @{0}
.
Jalur ini UPSTREAM=${1:-'@{u}'}
memungkinkan Anda untuk secara opsional melewati cabang upstream secara eksplisit, jika Anda ingin mengecek cabang jarak jauh yang berbeda dari yang dikonfigurasi untuk cabang saat ini. Ini biasanya berupa remotename / nama cabang . Jika tidak ada parameter yang diberikan, nilai defaultnya adalah @{u}
.
Script mengasumsikan bahwa Anda telah melakukan git fetch
atau yang git remote update
pertama, untuk membuat cabang pelacakan up to date. Saya tidak membuat ini menjadi skrip karena lebih fleksibel untuk dapat melakukan pengambilan dan perbandingan sebagai operasi terpisah, misalnya jika Anda ingin membandingkan tanpa mengambil karena Anda sudah mengambil baru-baru ini.