Спочатку скористайтеся 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 та керівником відділення, яке ви відстежуєте, хоча, оскільки є чотири можливі результати, ви не можете зменшити його до відповіді "так" чи "ні". Однак якщо ви готові зробити цеpull --rebase ви можете ставитися до "місцевий позаду", а "місцевий розбігся" як "потрібно тягнути", а два інших - як "не потрібно тягнути".
Ви можете отримати ідентифікатор фіксації будь-якого посилання, використовуючи git rev-parse <ref>, так що ви можете зробити це для master та origin / master та порівняти їх. Якщо вони рівні, гілки однакові. Якщо вони нерівні, ви хочете знати, що попереду іншого. Використання 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}дасть вам хеші двох рад. Це можна узагальнити за наступним сценарієм:
#!/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}'}дозволяє необов'язково пропускати гілку вищого потоку, якщо ви хочете перевірити іншу віддалену гілку, ніж ту, налаштовану для поточної гілки. Зазвичай це має видалене ім’я / ім'я гілки . Якщо параметр не заданий, значення за замовчуванням до @{u}.
Сценарій передбачає, що ви зробили git fetchабо git remote updateперше, щоб оновити гілки відстеження. Я не вбудовував це в сценарій, тому що це більш гнучко, щоб можна було вибирати і зіставляти як окремі операції, наприклад, якщо ви хочете порівняти без отримання, тому що ви вже отримали нещодавно.