Пошук уроків, статей та іншого контенту
Налаштуєте tracking branches і зрозумієте, як Git визначає відповідність локальних та віддалених гілок.
Відстежувальна гілка — це локальна гілка, для якої Git зберігає зв’язок із певною віддаленою гілкою.
Наприклад:
локальна гілка: feature/login
віддалена гілка: origin/feature/loginУ цьому випадку feature/login відстежує origin/feature/login.
Такий зв’язок називають:
upstream-гілкою;
tracking relationship;
зв’язком відстеження.
Відстежувальна гілка дає Git змогу визначити:
з якою віддаленою гілкою порівнювати локальну;
git pullкуди надсилати зміни;
скільки комітів локальна гілка випереджає або відстає від віддаленої.
Важливо: назви гілок не обов’язково мають збігатися. Локальна гілка work може відстежувати origin/main.
Розглянемо типову структуру:
main
origin/main
feature/login
origin/feature/loginmain — локальна гілка.
origin/main — локальне посилання на стан гілки main у віддаленому репозиторії.
feature/login — локальна гілка для розробки.
origin/feature/login — локальне посилання на віддалену гілку feature/login.
Запис origin/main не означає, що Git щоразу звертається до сервера. Це локальне remote-tracking reference, яке оновлюється під час git fetch, git pull або інших операцій, що отримують дані з віддаленого репозиторію.
git fetch originПісля цієї команди Git оновить origin/main, origin/feature/login та інші посилання відповідно до поточного стану репозиторію на сервері.
Після клонування Git зазвичай автоматично створює локальну гілку та налаштовує її відстеження:
git clone https://example.com/project.git
cd project
git branch -vvТиповий результат може виглядати так:
* main 1a2b3c4 [origin/main] Initial commitФрагмент [origin/main] показує upstream-гілку локальної main.
Якщо віддалена гілка вже існує, використайте:
git switch --track -c feature/login origin/feature/loginЦя команда:
створить локальну гілку feature/login;
переключить вас на неї;
налаштує її upstream-гілкою origin/feature/login.
Якщо локальна гілка має таку саму назву, як і віддалена:
git switch --track origin/feature/loginGit створить локальну feature/login і налаштує відстеження origin/feature/login.
Старіший, але все ще поширений варіант:
git checkout --track origin/feature/loginКоли локальної гілки ще немає на сервері, її можна створити та опублікувати так:
git switch -c feature/login
git push -u origin feature/loginОпція -u або --set-upstream виконує дві дії:
надсилає локальну гілку feature/login у origin;
встановлює origin/feature/login як upstream-гілку.
Після цього для наступних відправлень зазвичай достатньо виконати:
git pushА для отримання та інтеграції змін:
git pullДля локальної гілки Git зберігає два основні параметри:
назву віддаленого репозиторію;
назву гілки, яку вона відстежує.
Наприклад, для локальної feature/login конфігурація може бути такою:
[branch "feature/login"]
remote = origin
merge = refs/heads/feature/loginЦе означає:
віддалений репозиторій має назву origin;
upstream-гілка на ньому — feature/login.
Зазвичай не потрібно редагувати цей файл вручну. Для перегляду конфігурації використовуйте команди Git:
git config --get branch.feature/login.remote
git config --get branch.feature/login.mergeРезультат:
origin
refs/heads/feature/loginПоточну upstream-гілку зручно перевірити так:
git rev-parse --abbrev-ref --symbolic-full-name @{upstream}Якщо upstream налаштовано, команда виведе, наприклад:
origin/feature/loginПозначення @{upstream} означає upstream-гілку поточної локальної гілки.
git branch -vvЩоб побачити upstream-гілки всіх локальних гілок:
git branch -vvПриклад:
* main 1a2b3c4 [origin/main] Add authentication
feature/login 5d6e7f8 [origin/feature/login: ahead 2] Add login form
experiment 9a8b7c6 [origin/main: behind 1] Try alternative layoutТут:
main відстежує origin/main;
feature/login відстежує origin/feature/login і має два локальні коміти, яких ще немає у віддаленій гілці;
experiment відстежує origin/main і відстає від неї на один коміт.
Git показує стан відносно останньої відомої версії upstream-гілки. Щоб отримати найновіші дані із сервера, спочатку виконайте:
git fetch origin
git branch -vvgit statusНа відстежувальній гілці git status також показує різницю:
Your branch is ahead of 'origin/feature/login' by 2 commits.
(use "git push" to publish your local commits)Або:
Your branch is behind 'origin/feature/login' by 1 commit,
and can be fast-forwarded.Ці повідомлення можливі саме тому, що Git знає upstream-гілку поточної локальної гілки.
Для поточної локальної гілки:
git branch --set-upstream-to=origin/mainТепер поточна гілка відстежує origin/main.
Щоб налаштувати upstream для конкретної локальної гілки, не переключаючись на неї:
git branch --set-upstream-to=origin/main experimentПісля цього experiment відстежуватиме origin/main.
Повна форма команди також допускає скорочений запис:
git branch -u origin/main experimentЦе корисно, коли локальна та віддалена гілки мають різні назви:
git switch -c review
git branch --set-upstream-to=origin/main reviewТепер локальна review порівнюватиметься з origin/main, а не з origin/review.
Щоб локальна гілка більше не мала upstream-гілки:
git branch --unset-upstreamКоманда застосовується до поточної локальної гілки.
Для іншої локальної гілки:
git branch --unset-upstream experimentЦе не видаляє:
локальну гілку;
віддалену гілку;
коміти;
робочі файли.
Видаляється лише інформація про те, яку гілку потрібно вважати upstream.
Нехай команда вже має віддалену гілку origin/main, а ви починаєте нову функціональність:
git fetch origin
git switch main
git pull --ff-only
git switch -c feature/profileТепер локальна feature/profile ще не обов’язково має upstream-гілку. Опублікуймо її:
git push --set-upstream origin feature/profileПісля цього зв’язок має такий вигляд:
feature/profile -> origin/feature/profileПеревіримо його:
git branch -vvЗробимо зміни та створимо коміт:
git add .
git commit -m "Add profile page"
git pushОскільки upstream уже налаштовано, Git знає, що потрібно надсилати коміти з feature/profile до origin/feature/profile.
Повний приклад команд:
# Отримуємо актуальні дані з віддаленого репозиторію
git fetch origin
# Переключаємося на основну гілку та оновлюємо її
git switch main
git pull --ff-only
# Створюємо локальну гілку для нової функції
git switch -c feature/profile
# Створюємо файл із реалізацією функції
printf 'Profile page\n' > profile.txt
# Фіксуємо зміни
git add profile.txt
git commit -m "Add profile page"
# Публікуємо гілку та встановлюємо upstream
git push --set-upstream origin feature/profile
# Після цього наступні відправлення не потребують назв remote і гілки
printf 'User settings\n' >> profile.txt
git add profile.txt
git commit -m "Add user settings"
git pushgit pullКоманда:
git pullвикористовує upstream поточної гілки, якщо він налаштований.
Наприклад, перебуваючи на feature/profile, для якої upstream — origin/feature/profile, Git отримує зміни саме з цієї гілки.
Фактично git pull поєднує дві операції:
отримує зміни з віддаленого репозиторію;
інтегрує їх у поточну локальну гілку.
Якщо upstream не налаштовано, Git не знає, звідки отримувати зміни, і може показати помилку:
There is no tracking information for the current branch.У такому разі можна явно вказати remote і гілку:
git pull origin feature/profileАле для регулярної роботи з гілкою зручніше один раз налаштувати upstream:
git branch --set-upstream-to=origin/feature/profilegit pushБез upstream Git може вимагати явно вказати призначення:
git push origin feature/profileПісля налаштування upstream достатньо:
git pushUpstream визначає стандартне призначення для поточної гілки, але не змінює назву локальної гілки та не створює автоматично нові коміти.
Щоб явно встановити upstream під час відправлення, використовуйте:
git push -u origin feature/profileЦе особливо поширений спосіб першої публікації нової гілки.
Однакові назви не гарантують tracking relationship.
Наприклад, локальна гілка feature/login може існувати одночасно з origin/feature/login, але upstream може бути:
налаштований на origin/feature/login;
налаштований на origin/main;
не налаштований взагалі.
Перевіряйте фактичний зв’язок:
git branch -vvТак само одна локальна гілка може відстежувати віддалену гілку з іншою назвою:
git branch --set-upstream-to=origin/main feature/loginТепер feature/login відстежує origin/main, незалежно від схожості назв.
Поведінка git switch -c залежить від того, як створюється гілка.
Якщо створити гілку від локальної:
git switch main
git switch -c feature/searchнова feature/search зазвичай не матиме upstream-гілки лише через факт створення від main.
Якщо створити її безпосередньо від remote-tracking гілки:
git switch --track -c feature/search origin/feature/searchGit може автоматично налаштувати upstream.
Найнадійніше явно вказувати потрібний зв’язок через --track або встановлювати його під час першого push -u.
origin/main із локальною mainmain і origin/main — це різні посилання:
main — ваша локальна гілка;
origin/main — локальне відображення гілки main у remote origin.
Команда:
git switch origin/mainне переключає вас на звичайну локальну main. Вона переводить репозиторій у стан перегляду remote-tracking гілки, часто у detached HEAD.
Для роботи використовуйте:
git switch mainА якщо локальної main ще немає:
git switch --track origin/mainfetchorigin/main оновлюється не автоматично після змін на сервері. Спочатку отримайте нові дані:
git fetch originПісля цього порівняння локальної гілки з origin/main буде актуальнішим.
git push -u не на ту гілкуПеревірте назву поточної гілки перед публікацією:
git branch --show-currentПотім виконайте:
git push -u origin "$(git branch --show-current)"Або явно вкажіть назву, якщо ви її вже перевірили.
git pull завжди використовує origin/maingit pull використовує upstream поточної локальної гілки. Для feature/login це може бути origin/feature/login, а для іншої гілки — origin/main або взагалі інша гілка.
Перевірте налаштування:
git branch -vvЯкщо upstream встановлено неправильно, виправте його:
git branch --set-upstream-to=origin/feature/loginАбо приберіть зв’язок:
git branch --unset-upstreamВідстежувальна гілка — це локальна гілка з налаштованою upstream-гілкою.
Upstream складається з remote та назви віддаленої гілки.
Переглянути зв’язки можна командою git branch -vv.
Нову гілку можна опублікувати й відразу налаштувати через git push -u origin <branch>.
Гілку від віддаленої гілки можна створити командою git switch --track.
Змінити upstream можна через git branch --set-upstream-to.
Прибрати upstream можна через git branch --unset-upstream.
git pull і скорочений git push використовують upstream поточної локальної гілки.
origin/main — це локальне remote-tracking посилання, а не ваша локальна гілка main.
Назви локальної та віддаленої гілок можуть відрізнятися.