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.
Синтаксис
Формат 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. Он проверяет, что никто не запушил в remote с момента вашего последнего fetch, и откажет, если кто-то успел. Это предотвращает случайную потерю чужих коммитов.
-u origin branch-name при первом push? Настройте git config --global push.autoSetupRemote true (Git 2.37+). Теперь git push автоматически устанавливает upstream для новых веток.
git push не публикует теги. Для релиза всегда явно указывайте git push origin v1.0.0 или добавляйте флаг --follow-tags. Иначе коллеги не увидят тег, даже если видят коммит.