Пошук уроків, статей та іншого контенту
Розберете upstream-гілки, параметри -u та --set-upstream і скорочені команди для push та pull.
Upstream-гілка — це віддалена гілка, яку Git пов’язує з локальною гілкою. Таке пов’язання називають відстеженням (tracking).
Наприклад:
локальна гілка: feature/login
upstream: origin/feature/loginПісля налаштування upstream Git знає:
звідки отримувати зміни для git pull;
куди надсилати зміни для git push;
з якою віддаленою гілкою порівнювати локальну;
скільки комітів локальна гілка випереджає або відстає від віддаленої.
Upstream — це не обов’язково гілка
mainНехай репозиторій має remote з назвою origin. Після клонування Git зазвичай створює локальну гілку main, яка відстежує origin/main.
Ці назви означають різні об’єкти:
main — локальна гілка;
origin/main — локальне посилання на стан гілки main у remote origin.
Гілка origin/main не є безпосереднім підключенням до сервера. Це локальний стан віддаленої гілки, який оновлюється під час git fetch, git pull або інших операцій, що отримують дані з remote.
Переглянути налаштовані upstream-гілки можна так:
git branch -vvПриклад результату:
* main a1b2c3d [origin/main] Оновлено документацію
feature/login e4f5a6b [origin/feature/login: ahead 2] Додано форму входуПозначка ahead 2 означає, що локальна гілка має два коміти, яких ще немає у віддаленій гілці.
Інші можливі стани:
behind 3 — локальна гілка відстає на три коміти;
ahead 1, behind 2 — локальна та віддалена гілки мають різні коміти;
відсутність upstream — для локальної гілки не налаштовано відстеження.
-uКоли ви створюєте нову локальну гілку, вона ще не має upstream-гілки:
git switch -c feature/loginЯкщо виконати звичайний git push, Git може повідомити, що для поточної гілки не налаштовано upstream.
Під час першого надсилання використовуйте прапорець -u:
git push -u origin feature/loginПрапорець -u — скорочення від --set-upstream. Команда виконує дві дії:
надсилає локальну гілку feature/login до origin;
встановлює для неї upstream-гілку origin/feature/login.
Після цього можна використовувати скорочені команди:
git push
git pullGit уже знає, з якою віддаленою гілкою працювати.
Еквівалентний запис:
git push --set-upstream origin feature/loginЗамість явного імені поточної гілки можна використати HEAD:
git push -u origin HEADЦе зручно, якщо назва гілки довга або містить номер задачі. Git надсилає поточну гілку до origin і налаштовує upstream для неї.
Приклад повного сценарію:
# Створюємо та перемикаємося на нову гілку
git switch -c feature/login
# Додаємо зміни та створюємо коміт
git add login.js
git commit -m "Add login form"
# Публікуємо поточну гілку та налаштовуємо upstream
git push -u origin HEAD
# Наступні команди вже не потребують назви remote і гілки
git push
git pullІноді віддалена гілка вже існує, але локальна гілка ще не відстежує її. У такому разі можна окремо налаштувати upstream:
git branch --set-upstream-to=origin/main mainСкорочений варіант для поточної гілки:
git branch --set-upstream-to=origin/mainПісля цього поточна локальна гілка відстежуватиме origin/main.
Наприклад, локальна гілка release може відстежувати віддалену гілку origin/release:
git branch --set-upstream-to=origin/release releaseПеред налаштуванням переконайтеся, що Git уже знає про цю віддалену гілку. За потреби отримайте актуальний стан remote:
git fetch originЛокальна гілка може почати відстежувати іншу віддалену гілку:
git branch --set-upstream-to=origin/developТепер поточна локальна гілка використовуватиме origin/develop для git pull і порівняння станів.
Це корисно, наприклад, коли локальну гілку спочатку пов’язали з неправильною віддаленою гілкою.
Щоб повністю видалити налаштування upstream:
git branch --unset-upstreamПісля цього локальна гілка залишиться, але скорочені команди git push і git pull більше не матимуть збереженої цілі для цієї гілки.
git pushПісля виконання:
git push -u origin feature/loginдостатньо виконувати:
git pushУ типовій конфігурації Git ця команда надсилає поточну локальну гілку до її upstream-гілки.
Щоб явно вказати напрямок, можна використати повну форму:
git push origin feature/loginРізниця така:
git push origin feature/login щоразу явно вказує remote і гілку;
git push використовує налаштовану конфігурацію, зокрема upstream;
git push -u origin feature/login уперше надсилає гілку та налаштовує її upstream.
Якщо upstream не налаштовано, Git не завжди може безпечно визначити, куди саме надсилати поточну гілку. Тоді слід явно вказати remote і гілку або скористатися -u.
git pullКоманда:
git pullвикористовує upstream поточної локальної гілки.
Фактично git pull спочатку отримує нові дані з remote, а потім інтегрує їх у поточну локальну гілку. Спосіб інтеграції залежить від налаштувань Git і може бути виконаний через злиття або перемотування гілки.
Якщо upstream не налаштовано, використайте явну форму:
git pull origin feature/loginПісля першого успішного:
git push -u origin feature/loginможна працювати коротше:
git pull
git pushПоточну гілку можна переглянути так:
git branch --show-currentЇї upstream:
git rev-parse --abbrev-ref --symbolic-full-name '@{upstream}'Якщо upstream налаштовано, команда виведе, наприклад:
origin/feature/loginЯкщо upstream відсутній, Git повідомить про помилку.
Також корисна команда:
git statusВона може показати:
Your branch is ahead of 'origin/feature/login' by 2 commits.Це означає, що локальну гілку випереджають два коміти, які ще не надіслано до upstream.
Розглянемо послідовність дій для нової функції:
# Отримуємо останній стан віддалених гілок
git fetch origin
# Створюємо локальну гілку
git switch -c feature/profile
# Працюємо над файлами
git add profile.js
git commit -m "Add profile page"
# Публікуємо гілку та налаштовуємо upstream
git push --set-upstream origin feature/profile
# Після нових змін
git add profile.js
git commit -m "Add profile validation"
# Git використовує origin/feature/profile автоматично
git push
# Отримуємо нові зміни з тієї самої upstream-гілки
git pullПеревірити результат можна командою:
git branch -vvОчікувано локальна гілка матиме запис на кшталт:
* feature/profile 123abcd [origin/feature/profile] Add profile validationUpstream дозволяє скоротити команди, але він не замінює явне зазначення цілі в усіх ситуаціях.
Якщо upstream уже налаштовано:
git push
git pullЦе звичайний варіант для щоденної роботи з поточною гілкою.
Явна форма корисна, коли:
це перше надсилання нової гілки;
потрібно працювати не з upstream поточної гілки;
треба отримати зміни з іншої гілки;
ви хочете уникнути неоднозначності в командному сценарії.
Приклади:
git push origin feature/login
git pull origin main
git fetch originКоманда git pull origin main отримує зміни з origin/main для поточної локальної гілки. Вона не переналаштовує upstream поточної гілки на origin/main.
git push для нової гілки без -uПісля створення локальної гілки Git ще не знає, де має бути її віддалена копія.
Неповна команда:
git pushПравильне перше надсилання:
git push -u origin feature/loginorigin і upstream-гілкоюorigin — це назва remote, а origin/feature/login — віддалена гілка в цьому remote.
Upstream-гілка має повне ім’я:
origin/feature/loginТому команда:
git branch --set-upstream-to=origin/feature/loginвикористовує і назву remote, і назву гілки.
Команда:
git branch --set-upstream-to=origin/mainналаштовує upstream для поточної локальної гілки.
Якщо потрібно налаштувати іншу локальну гілку, вкажіть її в кінці:
git branch --set-upstream-to=origin/main developgit pull origin main змінює upstreamЦя команда одноразово вказує джерело для pull, але не обов’язково змінює постійне налаштування upstream.
Для постійного зв’язку використовуйте:
git branch --set-upstream-to=origin/mainЯкщо віддалену гілку щойно створили або перейменували, локальні дані можуть бути застарілими. Оновіть їх:
git fetch originПісля цього перевірте доступні віддалені гілки:
git branch -rUpstream-гілка — це віддалена гілка, пов’язана з локальною.
Перше надсилання нової гілки зазвичай виконують через git push -u origin <branch>.
-u і --set-upstream є еквівалентними прапорцями.
Після налаштування upstream можна використовувати git push і git pull без аргументів.
Переглянути зв’язки можна командою git branch -vv.
Upstream можна налаштувати окремо через git branch --set-upstream-to.
Видалити upstream можна командою git branch --unset-upstream.
origin — це remote, а origin/main — конкретна віддалена гілка в ньому.