Upstream
Коротко
Источник, относительно которого получают изменения: исходный проект при работе через форк или удалённая ветка, с которой связана локальная.
Что такое «Upstream»
Слово переводится как «вверх по течению»: изменения текут от источника к копиям. Обратное направление называют downstream. В Git термин используется в двух смыслах, и оба встречаются каждый день.
Первый смысл — удалённый репозиторий исходного проекта. Когда вы работаете через форк, ваша копия подключена как origin, а оригинал добавляют под именем upstream, чтобы забирать оттуда обновления. Второй смысл — отслеживаемая ветка: у локальной ветки можно указать удалённую пару, и тогда git push и git pull без параметров знают, куда отправлять и откуда брать.
Отслеживаемая ветка на практике
git branch --set-upstream-to=origin/main # связать текущую ветку
git push -u origin feature/catalog # связать при первой отправке
git status # покажет, насколько ветка впереди или позади
git log @{u}.. # мои коммиты, которых нет на сервере
git log ..@{u} # чужие коммиты, которые я ещё не встроил
На вопрос о статусе Git ответит, например: Your branch is ahead of 'origin/main' by 2 commits. Запись @{u} — сокращение для upstream текущей ветки. Сравнение «впереди на N, позади на M» Git считает по последнему загруженному состоянию, поэтому перед проверкой стоит выполнить git fetch. В новых версиях Git можно включить настройку push.autoSetupRemote, и связь будет создаваться автоматически при первой отправке.
«Отправить в апстрим»
В открытой разработке выражение означает: исправление нужно сделать не у себя, а в исходном проекте. Если вы поправили ошибку прямо в файлах чужого плагина WordPress, следующее обновление её сотрёт. Отправив исправление автору через запрос на слияние, вы получаете его во всех будущих версиях и не тащите собственную заплатку годами.
Типичная путаница
- Ожидать, что
git pullсам заберёт изменения из исходного проекта в форк. Он работает с upstream ветки, а это обычно вашorigin; оригинал нужно загружать явно:git fetch upstream. - Создать ветку локально и удивляться ошибке при
git pushбез параметров: у новой ветки ещё нет связанной удалённой.

