Спочатку скористайтеся 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
перше, щоб оновити гілки відстеження. Я не вбудовував це в сценарій, тому що це більш гнучко, щоб можна було вибирати і зіставляти як окремі операції, наприклад, якщо ви хочете порівняти без отримання, тому що ви вже отримали нещодавно.