Ключевые концепции

Удалённо-отслеживаемая ветка

Если твой репозиторий подключён к удалённому репозиторию (например, origin), у тебя обычно будет два набора веток:

  1. Локальные ветки — это обычные ветки, в которых идёт работа.

  2. Удалённо-отслеживаемые ветки (remote-tracking branches) — это специальные ветки только для чтения, которые отражают состояние веток в удалённом репозитории. Их названия имеют формат <имя-удалённого-репозитория>/<имя-ветки> (например, origin/main).

Зачем они нужны?

  • Чтобы сравнивать локальные ветки с удалёнными. Можно использовать команды вроде git log или git diff относительно origin/main, чтобы посмотреть, что изменилось на сервере, не трогая рабочее дерево.

  • Чтобы восстанавливать сломанные локальные ветки. Если локальная ветка пошла не туда, её можно сбросить к состоянию удалённо-отслеживаемой ветки (например, git switch main, а затем git reset --hard origin/main).

  • Чтобы создавать новые ветки. Нужно начать работу на основе того, что есть только на сервере? Создай локальную ветку из удалённо-отслеживаемой: git switch -c feature origin/feature.

Откуда они берутся?

  • После клонирования репозитория все ветки из удалённого репозитория копируются в виде удалённо-отслеживаемых веток в твой локальный репозиторий. Однако только ветка по умолчанию сразу становится полноценной локальной, и на неё происходит переключение.

    Например, если в удалённом репозитории есть ветки main, feature-1 и feature-2, в твоём локальном репозитории появятся удалённо-отслеживаемые ветки origin/main, origin/feature-1 и origin/feature-2, но только main будет создана как локальная ветка и сделана активной.

  • Выполнение git fetch обновляет существующие удалённо-отслеживаемые ветки в твоём репозитории и создаёт новые, если на сервере появились новые ветки.

    Если ветку удалили с сервера, соответствующая удалённо-отслеживаемая ветка всё равно останется локально, пока ты не очистишь её, выполнив git fetch --prune. Git никогда не удаляет данные без твоего явного согласия.
  • Выполнение git pull равносильно запуску git fetch с последующим git merge (или git rebase), поэтому оно также обновляет удалённо-отслеживаемые ветки.