git remotes

git push

Отправить локальные коммиты на удалённый репозиторий

Описание

git push публикует локальные коммиты в удалённом репозитории. Это основной способ делиться работой с командой: после того как изменения закоммичены локально, git push делает их доступными для всех, кто имеет доступ к remote.

Push выполняется только если является «fast-forward» — то есть история на сервере не содержит коммитов, которых нет у вас. Если коллега успел запушить изменения раньше, Git откажет в push с ошибкой «rejected — non-fast-forward». В этом случае нужно сначала выполнить git pull, разрешить возможные конфликты, и только потом повторить push.

Первый push новой ветки требует явного указания remote и флага -u (upstream): git push -u origin feature/my-branch. После этого последующие git push будут работать без аргументов — Git запомнит связь ветки с remote.

Синтаксис

git push [<options>] [<remote> [<refspec>...]] # Основные формы git push # push текущей ветки в tracking-remote git push origin # push всех веток в origin git push origin main # push ветки main в origin git push origin feature:main # push локальной feature как main на remote git push origin --delete <branch> # удалить ветку на remote git push origin <tag> # отправить тег git push origin --tags # отправить все теги

Формат refspec<src>:<dst>, где src — локальная ссылка, dst — имя на remote. Если dst не указан, Git использует то же имя. Пустой src (:remote-branch) удаляет ветку на remote.

Флаги и опции

Флаг Описание
-u, --set-upstream Установить tracking-upstream для текущей ветки. После этого git push и git pull работают без аргументов.
--force, -f Принудительно перезаписать историю на remote, даже если это не fast-forward. Опасно в общих ветках — удаляет чужие коммиты.
--force-with-lease Безопасная альтернатива --force: перезаписывает только если remote не изменился с момента последнего fetch. Защита от случайного удаления чужих коммитов.
--force-if-includes Дополнительная проверка к --force-with-lease: убеждается, что все коммиты remote включены в вашу историю rebase.
--delete, -d Удалить ветку или тег на remote. Эквивалент git push origin :branch-name.
--tags Отправить все локальные теги, которых нет на remote. Обычный push теги не отправляет.
--follow-tags Отправить только те теги, которые указывают на коммиты в текущем push. Разумная альтернатива --tags.
--all Отправить все локальные ветки на remote.
--mirror Зеркалировать репозиторий: отправить все ссылки (ветки, теги) и удалить на remote всё, чего нет локально. Используется для создания точных зеркал.
--dry-run, -n Показать, что будет отправлено, без реальной отправки. Полезно для проверки перед важным push.
--verbose, -v Подробный вывод: показывать что именно отправляется.
--quiet, -q Минимальный вывод — только ошибки.

Паттерны использования

Первый push новой ветки

# Создать ветку и опубликовать её
git checkout -b feature/user-auth
# ... делаем изменения и коммиты ...
git push -u origin feature/user-auth

# Теперь можно просто
git push

Безопасный force push после rebase

# После git rebase нужен force push
# НЕ используйте --force в общих ветках!

# Безопасно: проверяет, что remote не изменился
git push --force-with-lease

# Ещё безопаснее (Git 2.30+)
git push --force-with-lease --force-if-includes

Удалить ветку на remote

# После слияния PR удалить ветку
git push origin --delete feature/user-auth

# Эквивалентный синтаксис
git push origin :feature/user-auth

# Удалить локальную tracking-ветку
git branch -d feature/user-auth

Публикация тегов (релиз)

# Создать аннотированный тег
git tag -a v1.2.0 -m "Release 1.2.0: feature X, fix Y"

# Отправить конкретный тег
git push origin v1.2.0

# Или все теги сразу
git push origin --tags

Отправить на другое имя ветки

# Опубликовать local-branch как main на remote
git push origin local-branch:main

# Push в staging-окружение
git push staging main:production

Исправить отвергнутый push

# Ошибка: ! [rejected] main -> main (non-fast-forward)
# Решение: сначала pull, потом push
git pull --rebase origin main
# Разрешить конфликты если есть
git push origin main

Советы и подводные камни

--force-with-lease вместо --force: Если нужен force push (например, после rebase feature-ветки), всегда используйте --force-with-lease. Он проверяет, что никто не запушил в remote с момента вашего последнего fetch, и откажет, если кто-то успел. Это предотвращает случайную потерю чужих коммитов.
push.autoSetupRemote: Устали писать -u origin branch-name при первом push? Настройте git config --global push.autoSetupRemote true (Git 2.37+). Теперь git push автоматически устанавливает upstream для новых веток.
Никогда не делайте force push в main/master: Force push в общую ветку перезапишет историю для всей команды. Коллеги, у которых эта ветка была локально, получат расхождение. В серьёзных проектах main защищается на GitHub/GitLab от force push на уровне настроек репозитория — настройте это сразу.
Теги не отправляются автоматически: git push не публикует теги. Для релиза всегда явно указывайте git push origin v1.0.0 или добавляйте флаг --follow-tags. Иначе коллеги не увидят тег, даже если видят коммит.