Tracking branch (она же «upstream branch») - это указатель внутри
локальной ветки на «свою» удалённую. Хранится в .git/config:
[branch "main"]
remote = origin
merge = refs/heads/main
Это значит: «локальная main привязана к origin/main». Что это даёт:
git pullбез аргументов знает, откуда тянуть.git pushбез аргументов знает, куда пушить.git statusсравнивает с этой удалённой: «Your branch is ahead by 3 commits».- В
git branch -vvрядом с веткой видно её upstream.
Как устанавливается
Три способа:
# 1. При первом push
git push -u origin feature
# эквивалент: git push --set-upstream origin feature
# 2. Постфактум для существующей ветки
git branch --set-upstream-to=origin/feature feature
# 3. При switch -c из remote
git switch -c feature origin/feature
После любого из этих способов ветка «привязана», и дальнейшие
git pull / git push работают без аргументов.
remote-tracking branch - это отдельное
Не путай:
- Tracking branch - локальная ветка, помнящая свою remote (упомянуто выше).
- Remote-tracking branch -
origin/main,origin/feature/x. Это локальные refs, отражающие состояние remote (см. fetch).
Их связь:
локальная main ─ tracks ─→ origin/main (remote-tracking branch)
↑
fetch обновляет это
Что показывает git status
On branch feature
Your branch is ahead of 'origin/feature' by 2 commits.
Это значит:
- У тебя есть 2 коммита, которых нет в
origin/feature. - Нужно push'нуть.
Your branch is behind 'origin/feature' by 3 commits.
- На remote есть 3 коммита, которых у тебя нет.
- Нужно pull или fetch.
Your branch and 'origin/feature' have diverged,
and have 2 and 3 different commits each, respectively.
- И у тебя, и на remote есть свои коммиты после общего предка.
- Нужно решать: merge, rebase или нагнать чужие и переписать свои.
Без tracking
Если у локальной ветки нет upstream:
git push
# fatal: The current branch feature has no upstream branch.
# To push the current branch and set the remote as upstream, use
# git push --set-upstream origin feature
Это специально: Git не угадывает, куда пушить новую ветку. Нужно
явно сказать -u origin feature.
Подводные камни
- Tracking теряется при переименовании remote. Если сделать
git remote rename origin foo, у локальных ветокbranch.X.remote = originостанется, и pull/push сломаются.git remote renameобычно это правит, но проверь после. - «Ghost» tracking после удаления remote-ветки. Если ветку на
remote удалили, локальный tracking остаётся «привязан» к
несуществующей.
git fetch --pruneубирает мёртвые refs. - Конфиг отдельно от состояния. В
.git/configпишется, кому тебя пушить. А actual SHA лежит вrefs/remotes/origin/<branch>. Если refs устарели -git fetch.