Что такое remote
Remote — именованная ссылка на другую копию репозитория, обычно origin. Удалённо-отслеживающие ветки вроде origin/main — read-only локальные зеркала, обновляемые только git fetch. Различай: твоя локальная main против origin/main, последнего известного снимка удалёнки.
Ты клонируешь проект с GitHub, делаешь коммит и запускаешь git status. Он говорит Your branch is ahead of 'origin/main' by 1 commit. Что такое origin? Что такое origin/main и почему это не та же main, на которой ты стоишь? Этими именами размахивают так, будто они очевидны, но они называют три разные вещи, и путаница между ними — корень большинства непоняток «почему не пушится».
К концу этого урока ты сможешь объяснить, что такое remote, что на самом деле хранит удалённо-отслеживающая ветка вроде origin/main и почему она меняется только тогда, когда ты об этом попросишь.
После этого урока ты сможешь объяснить, что remote — это именованный URL другой копии репозитория, что origin/main — это read-only локальное зеркало ветки удалёнки, обновляемое только командой git fetch, и чем это отличается от твоей собственной локальной main.
Remote — это просто сохранённое имя для URL другой копии твоего репозитория. Git не вшивает «сервер» в проект жёстко. Вместо этого он хранит короткие имена, указывающие на полные копии репозитория, живущие где-то ещё — на GitHub, GitLab, машине коллеги или в другой папке на диске. Перечисли их с -v (verbose), чтобы увидеть URL:
git remote -v
# origin git@github.com:acme/app.git (fetch)
# origin git@github.com:acme/app.git (push)origin — единственное, что здесь особенное: это общепринятое имя по умолчанию, которое git даёт удалёнке, откуда ты клонировал. В самом слове «origin» нет ничего магического; его можно переименовать.
Remote-ы добавляют и осматривают командой git remote. У репозитория может быть много remote-ов — это частый случай, когда ты форкнул проект и хочешь иметь и свой форк, и оригинал-upstream:
git remote add upstream https://github.com/original/app.git
git remote -v # теперь показывает и origin, и upstream
git remote rename origin gh
git remote remove upstreamgit remote add <имя> <url> просто записывает соответствие имя → URL. Он ещё ничего не скачивает. Получение данных — отдельный явный шаг.
origin/main — это удалённо-отслеживающая ветка: read-only локальное зеркало ветки на удалёнке. Это место новички упускают. Когда ты клонируешь, git создаёт две разные вещи:
main— твоя локальная ветка. Ты коммитишь на неё; она двигается, когда коммитишь ты.origin/main— удалённо-отслеживающая ветка. Это локальная запись git о том, где былаmainна удалёнке в последний раз, когда ты общался с сервером.
Ты не можешь коммитить на origin/main. Она read-only. Это закладка, а не рабочее пространство.
git branch -a
# * main
# remotes/origin/main▸Почему это работает
Зачем вообще держать отдельную локальную копию веток удалёнки? Потому что git распределённый и работает офлайн. origin/main позволяет ответить на вопрос «что было на сервере, когда я проверял в последний раз?» и сравнить это со своей локальной работой — git log main..origin/main — без единого сетевого вызова. Цена в том, что это зеркало может быть устаревшим: оно отражает твою последнюю синхронизацию, а не живой сервер. Обновление этого зеркала — работа git fetch, и больше ничто его не двигает.
Только git fetch обновляет твои удалённо-отслеживающие ветки. Правка файлов, коммиты, переключение веток — ничто из этого не трогает origin/main. Зеркало двигается вперёд только когда ты связываешься с сервером:
git fetch origin
# скачивает новые коммиты с удалёнки и
# продвигает origin/main под состояние сервера — твоя
# локальная main остаётся ровно там, где былаgit clone делает всю эту настройку за один раз: копирует всю историю, создаёт remote origin, создаёт origin/main и делает checkout локальной main, уже настроенной на отслеживание.
Как правильно читать «ahead by 1 commit».
Ты клонируешь acme/app. Сразу после клонирования main и origin/main указывают на один и тот же коммит c3. Ты пишешь фикс и делаешь git commit — теперь локальная main указывает на твой новый коммит c4, но origin/main всё ещё на c3, потому что ты не связывался с сервером. git status сообщает «ahead of ‘origin/main’ by 1 commit» — он сравнивает твою ветку со своим последним известным снимком удалёнки.
Тем временем коллега пушит свой коммит c5 в настоящую удалёнку. Твоя origin/main этого не замечает — она всё ещё говорит c3. Только когда ты запустишь git fetch origin, git скачает c5 и подвинет origin/main на него. Теперь git status может сказать тебе правду: твоя ветка и удалёнка разошлись (у тебя c4, у них c5). Урок: origin/main — это снимок, которым управляешь ты, а не живая трансляция.
▸Частая ошибка
Частая ошибка — думать, что git fetch изменил твою работу, потому что git status вдруг говорит «behind by 3 commits». Он не изменил ничего твоего — он лишь обновил origin/main под настоящее состояние сервера, чтобы git наконец мог сообщить истинное соотношение. Твои файлы и твои локальные коммиты нетронуты. Fetch — самая безопасная удалённая команда именно потому, что пишет только в удалённо-отслеживающие ветки, а в твоё рабочее дерево — никогда.
Ты только что сделал git commit локально. Затем коллега запушил два коммита в удалёнку на GitHub. Прежде чем ты запустишь любую другую команду, на что указывает origin/main?
Remote — это сохранённое имя (по умолчанию origin) для URL другой полной копии репозитория; git remote -v перечисляет их, а git remote add записывает новые, ничего не скачивая. Удалённо-отслеживающая ветка вроде origin/main — это read-only локальное зеркало ветки на удалёнке, память git о том, где был сервер в последний раз, когда ты синхронизировался. Она двигается только когда ты запускаешь git fetch, а не когда коммитишь, поэтому твоя локальная main и origin/main регулярно указывают на разные коммиты. git clone настраивает всё это автоматически. Дальше ты узнаешь, как реально двигать коммиты через этот разрыв — git push и git pull.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.