Отслеживаемые ветки и upstream

Понимаем, откуда git знает, куда отправлять push и откуда брать pull без указания ветки.

Отслеживаемая ветка (tracking branch) — локальная ветка, связанная с удалённой. Удалённая ветка, на которую она настроена, называется её upstream.

Зачем нужна связь

Когда вы пишете просто git push или git pull без аргументов, git должен откуда-то знать, с какой удалённой веткой работать. Эта связь и есть upstream. Установив её один раз (например, флагом -u при первом push), вы избавляетесь от необходимости каждый раз указывать origin main.

origin/main — это не ваша ветка

Различайте два понятия:

mainваша локальная ветка, которую вы редактируете
origin/main«снимок» серверной ветки на момент последнего fetch/pull

Ветки вида origin/main называют remote-tracking. Вы их не редактируете напрямую — git обновляет их сам при общении с сервером.

Смотрим связи

Показать ветки вместе с их upstream и расхождением (ahead/behind):

git branch -vv

Вывод:

* main    a1b2c3d [origin/main] Добавить профиль
  feature 9f8e7d6 [origin/feature: ahead 2] WIP

Здесь ahead 2 значит, что у вас на 2 коммита больше, чем на сервере, — их стоит запушить.

Настроить upstream вручную

Если связи нет (например, ветку создал кто-то другой), задайте её:

git branch --set-upstream-to=origin/main main

Или прямо при push — мы это уже видели:

git push -u origin feature

Удаление веток на сервере

Удалить ветку локально и удалить её на сервере — разные действия. Локальное удаление: git branch -d feature. Удалить ветку на сервере:

git push origin --delete feature

А чтобы убрать у себя устаревшие remote-tracking ветки, которых уже нет на сервере:

git fetch --prune

Откуда git берёт значения по умолчанию

Когда вы вводите голый git push, git заглядывает в настройку upstream текущей ветки и понимает: «отправить на origin в ветку main». Без этой связи он не знает, куда пушить, и потребует явно указать git push origin main. Upstream — это, по сути, сохранённый адрес «куда по умолчанию», избавляющий от повторного ввода одного и того же.

Поддерживайте чистоту списка веток

Со временем в проекте накапливаются ветки, которые давно слили и удалили на сервере, но их «призраки» (origin/feature-old) остаются у вас локально. Команда git fetch --prune убирает такие устаревшие remote-ссылки. Запускайте её время от времени, чтобы git branch -a показывал актуальную картину, а не кладбище старых веток.

Итог

  • Upstream — удалённая ветка, с которой связана локальная; благодаря ему работают короткие push/pull.
  • origin/main — снимок серверной ветки, его не редактируют вручную.
  • git branch -vv показывает связи и расхождение ahead/behind.
Проверьте себя
1. Что такое upstream для локальной ветки?
AСамый первый коммит
BУдалённая ветка, с которой связана локальная
CПапка .git
DИмя автора коммита
2. Что представляет собой ветка origin/main?
AВашу локальную ветку для редактирования
BСнимок серверной ветки на момент последнего fetch/pull, который вы не правите вручную
CРезервную копию рабочей директории
DКонфликтную версию файла
3. Как удалить ветку feature на удалённом сервере?
Agit branch -d feature
Bgit push origin --delete feature
Cgit fetch feature
Dgit remote remove feature
Поддержать проект