Урок курса

Отправить ветку и настроить 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.

Задача:

  1. В git_practice создайте только рабочий clone: git clone remote/shared.git my_clone, затем cd my_clone.
  2. До первого коммита задайте обе локальные настройки автора знакомыми командами: git config user.name "Student" и git config user.email "student@example.com".
  3. В 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 исчезла.
  4. Только после обеих успешных отправок перейдите обратно в git_practice (cd ..), создайте свежий colleague_clone: git clone remote/shared.git colleague_clone, затем cd colleague_clone.
  5. Выполните 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 недостаточно?

Выберите один вариант
Без регистрации · результат не сохраняется

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку