Урок курса
Отправить ветку и настроить tracking
Git и GitHub с нуля: бесплатный курс с практикойВ прошлом уроке мы сделали clone и увидели, что Git автоматически регистрирует origin и создаёт remote-tracking ветки вроде origin/main. Origin хранит адрес источника, а upstream связывает конкретную локальную ветку с её remote-tracking веткой. Для новой feature эта связь задаётся при первой отправке с флагом -u; после неё следующие коммиты можно отправлять обычным push в том же учебном clone.
Tracking-связь: что такое upstream локальной ветки
Remote origin — это просто именованный адрес другого репозитория. Сам по себе он не говорит Git, куда отправлять коммиты из конкретной ветки. Для этого существует отдельная настройка: upstream, или tracking-связь.
Upstream — это привязка конкретной локальной ветки к конкретной remote-tracking ветке. Например, локальная ветка feature может быть привязана к origin/feature. Это означает, что Git знает: когда ты работаешь в feature, её «партнёр» на стороне remote — именно origin/feature.
Важно не путать два уровня:
- origin — это remote, то есть ссылка на весь репозиторий shared.git целиком.
- upstream ветки — это связь одной конкретной ветки с одной конкретной remote-tracking веткой внутри этого remote.
Наличие origin не означает автоматической upstream-связи для новых веток. Когда ты создаёшь git switch -c feature в clone, эта ветка существует только локально. У неё нет upstream до тех пор, пока ты его явно не задашь.
Настройка хранится в конфигурации именно этого clone — в его .git/config. Другие клоны того же репозитория никак не затрагиваются: у каждого клона своя таблица tracking-связей.
git push -u origin <ветка>: первая отправка и настройка upstream
Когда локальная ветка feature готова к первой отправке, нужна команда:
git push -u origin feature
Здесь origin — remote назначения, feature — имя локальной ветки. Вся команда git push -u origin feature при успешной отправке даёт три результата:
- создаёт ветку
featureв remote, если её там ещё не было; - отправляет коммиты из локальной
featureв remote; - записывает upstream: теперь локальная
featureсвязана сorigin/feature.
Создание или обновление ветки в remote и передача коммитов — эффекты push. Флаг -u (длинная форма --set-upstream) добавляет настройку upstream для отправленной локальной ветки.
В выводе команды будет подтверждение настройки связи — точная фраза зависит от версии Git, но смысл один: tracking настроен.
Если попробовать отправить новую ветку без флага -u — обычным git push — при стандартных настройках Git ответит ошибкой:
fatal: The current branch feature has no upstream branch.
Git не угадывает, куда именно отправлять ветку, и честно сообщает об отсутствии upstream. В том же сообщении он предложит точную команду с --set-upstream. Наличие origin само по себе эту проблему не решает — нужен явный -u при первой отправке.
git branch -vv и git push: чтение статуса опережения и повторная отправка
После первого git push -u origin feature команда git branch -vv показывает состояние локальных веток вместе с их upstream:
* feature 57397ed [origin/feature] Добавить версию
main e0b770e [origin/main] Первый справочник
Каждая строка содержит: * у текущей ветки, имя ветки, короткий хеш последнего коммита, upstream в квадратных скобках и сообщение коммита. Если у ветки нет upstream, квадратных скобок не будет вовсе.
Теперь добавим второй коммит — например, в README.md добавлена строка Автор: учебный проект:
git add README.md
git commit -m "Добавить автора"
Сразу после этого git branch -vv покажет изменение в поле upstream:
* feature 3a1c92f [origin/feature: ahead 1] Добавить автора
main e0b770e [origin/main] Первый справочник
ahead 1 означает: локальная ветка опережает origin/feature на один коммит, который ещё не отправлен. Git знает это потому, что у ветки настроен upstream и он может сравнить указатели.
Отправить этот коммит теперь можно без аргументов:
git push
Git сам знает, куда идти — в origin/feature. После успешной отправки снова запустим git branch -vv:
* feature 3a1c92f [origin/feature] Добавить автора
main e0b770e [origin/main] Первый справочник
Пометка ahead 1 исчезла: локальная ветка и origin/feature указывают на один и тот же коммит.
Проверка: оба коммита в свежем clone через git log origin/feature
После того как обе отправки завершены, можно создать второй clone и убедиться, что shared.git содержит всю историю ветки feature.
Для независимого опыта распакуйте весь git_practice.zip в новую отдельную папку через файловый менеджер. Используйте новую распаковку, а не папку после предыдущего clone: в ней my_clone и colleague_clone ещё отсутствуют. Выданный git_practice/remote/shared.git содержит начальную ветку main и один коммит; README.md в нём содержит «# Командный справочник», «Контакт: команда» и «Статус: черновик».
Используйте обычный clone с неизменёнными настройками отправки. Между вашими отправками в этот учебный remote не должно быть чужих push. Откройте терминал в новой папке распаковки. Рабочий clone создаётся и обе локальные настройки автора задаются до первого коммита:
cd git_practice
git clone remote/shared.git my_clone
cd my_clone
git config user.name "Student"
git config user.email "student@example.com"
git switch -c feature
Добавляем в README.md строку Версия: 1.0, затем:
git add README.md
git commit -m "Добавить версию"
git push -u origin feature
git branch -vv
Upstream настроен, [origin/feature] виден в выводе. Добавляем в README.md строку Автор: учебный проект:
git add README.md
git commit -m "Добавить автора"
git branch -vv
Видим [origin/feature: ahead 1]. Отправляем:
git push
git branch -vv
Пометка ahead 1 исчезла. Только теперь создаём проверочный clone:
cd ..
git clone remote/shared.git colleague_clone
cd colleague_clone
git log --oneline origin/feature
Аргумент origin/feature в команде git log — это имя remote-tracking ветки: показать историю именно этой ветки, а не текущей локальной. Новый clone получил origin/feature автоматически при создании, никаких дополнительных команд не нужно.
Вывод будет примерно таким (хеши у вас будут свои):
3a1c92f Добавить автора 57397ed Добавить версию
Оба коммита на месте. Заметьте: colleague_clone создаётся только после обеих отправок — иначе он получил бы только часть истории. И в colleague_clone мы не создаём коммиты, поэтому настройка автора там не нужна.
Задача 1
В стандартном clone без чужих отправок успешно выполнили push -u origin feature, затем добавили один местный коммит без отправки. Как выглядит связь ветки в branch -vv?
Задача 2
Самостоятельная практика:
Сделайте новую распаковку git_practice.zip для независимого опыта. В git_practice/remote/shared.git находится bare-репозиторий: начальная ветка main, один коммит, README.md содержит «# Командный справочник», «Контакт: команда», «Статус: черновик». Папок my_clone и colleague_clone ещё нет. Используйте обычный clone с неизменёнными настройками отправки и без чужих изменений remote между вашими push.
Задача:
- В git_practice создайте только рабочий clone:
git clone remote/shared.git my_clone, затемcd my_clone. - До первого коммита задайте обе локальные настройки автора знакомыми командами:
git config user.name "Student"иgit config user.email "student@example.com". - В my_clone:
a. Создайте и выберите feature:git switch -c feature.
b. Добавьте в README.md строкуВерсия: 1.0и создайте коммитДобавить версию.
c. Отправьте ветку командойgit push -u origin feature; найдите подтверждение настройки upstream.
d. Выполнитеgit branch -vv: перед сообщением коммита у feature виден[origin/feature].
e. Добавьте строкуАвтор: учебный проект, создайте коммитДобавить автора; вgit branch -vvтеперь видна[origin/feature: ahead 1].
f. Выполните обычныйgit push, затемgit branch -vv: пометка ahead исчезла. - Только после обеих успешных отправок перейдите обратно в git_practice (
cd ..), создайте свежий colleague_clone:git clone remote/shared.git colleague_clone, затемcd colleague_clone. - Выполните
git log --oneline origin/feature: аргумент origin/feature выбирает историю этой remote-tracking ветки. Новый clone уже получил её при создании. Убедитесь, что видныДобавить автораиДобавить версию; запишите вывод. В этом clone не нужно создавать коммиты.
Доступный API: cd, git clone, git config user.name, git config user.email, git switch -c, git add, git commit -m, git push -u origin <ветка>, git push, git branch -vv, git log --oneline origin/feature. Критерии: upstream feature настроен, второй коммит отправлен обычным push, свежий проверочный clone видит оба сообщения. Критерии не требуют совпадения случайных хешей.
Письменное объяснение:
Коллега говорит: «Я создал ветку hotfix в своём clone, сделал коммит и выполнил git push. Git выдал ошибку и предложил использовать git push --set-upstream origin hotfix. Я не понимаю — ведь origin уже зарегистрирован, я вижу его в git remote -v. Почему push не работает просто так?»
Объясните коллеге: что именно отсутствует и почему наличие origin в git remote -v не означает, что у ветки настроен upstream.
Платформа проверяет только ответ ниже; действия в своём репозитории и письменные ответы вы проверяете самостоятельно.
Контрольный случай:
Remote origin зарегистрирован, новую hotfix ещё не отправляли. В стандартном clone обычный push сообщает об отсутствии upstream. Почему наличия origin недостаточно?
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
