Отслеживаемые ветки и 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.