git push
На этой странице вы найдёте полезную информацию о команде git push, её использовании, основных параметрах и важных советах.
На этой странице объясняется, что делает git push, описывается синтаксис и наиболее полезные параметры, принципы работы с обычными и bare-репозиториями, как задать upstream-ветку, как безопасно выполнить принудительную отправку и как удалить удалённую ветку. Все примеры содержат корректные команды Git с выводом, которые можно воспроизвести самостоятельно.
Определение
Команда git push загружает коммиты из локального репозитория в удалённый. Отправка — это операция, противоположная получению: если git fetch импортирует коммиты в локальные ветки слежения, то git push экспортирует ваши локальные коммиты в удалённые ветки, чтобы коллеги могли их увидеть.
Базовый синтаксис:
git push <remote> <branch><remote> — имя удалённого репозитория (чаще всего origin), а <branch> — локальная ветка, коммиты которой вы хотите опубликовать.
Использование git push
Команда git push обычно используется для публикации локальных изменений в центральном репозитории. После того как вы зафиксировали изменения локально, запустите git push, чтобы поделиться ими с остальными участниками команды. Эта команда является частью рабочего процесса синхронизации. Все такие команды работают с удалёнными ветками, настроенными с помощью команды git remote: коммиты загружаются с помощью git push, а скачиваются с помощью git fetch и git pull. После скачивания git merge интегрирует изменения в рабочую ветку.
При успешной отправке выводится сводка переданных данных. Например, отправка двух новых коммитов в master выглядит так:
$ git push origin master
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Writing objects: 100% (6/6), 612 bytes | 612.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:example/repo.git
a1b2c3d..e4f5g6h master -> masterСтрока a1b2c3d..e4f5g6h master -> master подтверждает, какие коммиты были перемещены, и что ваш локальный master теперь совпадает с удалённым master.
Следующая диаграмма показывает, как локальный master опережает master в центральном репозитории, и как эти изменения публикуются с помощью команды git push origin master.

Основные параметры
git push <remote> <branch> | Отправляет указанную ветку в <remote> с необходимыми коммитами, создавая удалённую ветку в целевом репозитории. |
|---|---|
git push <remote> --force | Принудительно выполняет отправку, даже если это приводит к обновлению, несовместимому с fast-forward. Убедитесь, что никто не извлёк эти коммиты, прежде чем использовать параметр --force. |
git push <remote> --all | Отправляет все локальные ветки в удалённый репозиторий. |
git push <remote> --tags | Отправляет теги из локальных веток в удалённый репозиторий. Параметр --all не отправляет теги. |
git push -u <remote> <branch> | Отправляет ветку и записывает её как upstream-ветку (ветку слежения), чтобы в дальнейшем можно было запускать git push и git pull без аргументов. |
git push <remote> --force-with-lease | Выполняет принудительную отправку только в том случае, если удалённая ветка не изменилась с момента последнего fetch — более безопасная альтернатива --force. |
git push <remote> --dry-run | Показывает, что будет отправлено, не передавая ничего на удалённый репозиторий. |
Как выполнять отправку в bare-репозитории
Bare-репозиторий — это репозиторий, созданный с флагом --bare (git init --bare или git clone --bare). У него нет рабочего каталога, поэтому никто не может редактировать файлы или делать коммиты непосредственно в нём. Это делает его безопасным для отправки, именно поэтому центральные и общие репозитории (размещённые на сервере или сервисе вроде GitHub) являются bare. Отправка в обычный (non-bare) репозиторий, в котором активна checked out ветка, может конфликтовать с рабочим деревом этой ветки, поэтому Git по умолчанию отклоняет такие отправки.
# create a shared central repository
git init --bare central.gitЧто происходит при отклонении отправки
Git отклоняет вашу отправку, когда удалённая ветка содержит коммиты, которых у вас нет локально — это обновление, несовместимое с fast-forward. Обычно это означает, что кто-то из команды выполнил отправку раньше вас. Ошибка выглядит так:
$ git push origin master
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'github.com:example/repo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.Решение — сначала получить изменения с удалённого репозитория, затем снова выполнить отправку:
git pull origin master # fetch + merge (or use --rebase)
git push origin masterИспользуйте --force только тогда, когда намеренно хотите перезаписать историю удалённого репозитория (см. ниже) — но не для обхода этой проверки безопасности на общих ветках.
Принудительная отправка
Флаг --force перезаписывает удалённую ветку вашей локальной, удаляя все upstream-коммиты, которые не были получены. Используйте его только в том случае, если вы намеренно переписали историю — например, после git commit --amend или интерактивного git rebase — и вы уверены, что никто другой не основывал свою работу на заменяемых коммитах. Когда коммит изменяется или переносится, его хеш меняется, поэтому Git воспринимает его и удалённый коммит как расходящееся содержимое и отклоняет обычную отправку; для публикации переписанного коммита требуется --force.
Для общих веток предпочтительнее использовать --force-with-lease (описано ниже): он откажется перезаписывать изменения, которые появились в удалённом репозитории после вашего последнего fetch, поэтому вы не сможете незаметно уничтожить коммиты коллеги.
git push --force
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin masterКак удалить удалённую ветку
Вот пример удаления удалённой ветки. Имя branch_name с двоеточием перед ним, переданное команде git push, удаляет удалённую ветку:
delete remote branch, git push
git branch -D branch_name
git push origin :branch_nameКоманда git push origin :branch_name удаляет указанную ветку (branch_name) из удалённого репозитория (origin), отправляя в него пустую ссылку.
Как это работает
git push: отправляет изменения из локального репозитория Git в удалённый репозиторийorigin: имя удалённого репозитория:branch_name: refspec, представляющий пустую ссылку, что фактически удаляет указанную ветку из удалённого репозитория
Таким образом, когда вы выполняете git push origin :branch_name, Git удалит ветку branch_name из удалённого репозитория origin.
Обратите внимание, что эта команда может быть опасной при неправильном использовании, так как удаляет ветку без какого-либо подтверждения и без возможности восстановления. Обязательно дважды проверьте имя ветки и убедитесь, что действительно хотите её удалить, прежде чем выполнять команду.
Использование флага -u при первой отправке ветки
Когда у вас есть локальная ветка и вы хотите впервые отправить её в удалённый репозиторий, необходимо указать, какую именно ветку удалённого репозитория вы имеете в виду. В Git флаг -u используется с командой git push для задания upstream-ветки для текущей ветки. При использовании флага -u Git создаёт связь между вашей локальной веткой и удалённой веткой. Эта связь упрощает команды git pull и git push в будущем, позволяя Git запомнить, какая удалённая ветка соответствует вашей локальной.
Флаг -u является сокращением от --set-upstream. При использовании этого флага команда обычно выглядит так:
Использование флага -u при первой отправке ветки
git push -u origin your-branch-nameПосле этого ваша локальная ветка отслеживает origin/your-branch-name. В дальнейшем вы можете запускать git push и git pull без дополнительных аргументов, находясь на этой ветке, а git status будет показывать, насколько ваша ветка опережает или отстаёт от удалённой. Подробнее о локальных ветках и ветках слежения читайте в разделе git branch.
Примеры часто используемых флагов
Ниже приведены краткие примеры наиболее полезных флагов git push.
-f (force)
git push -f origin masterПринудительно отправляет локальную ветку master в origin, перезаписывая все коммиты на удалённом master, которых у вас нет локально. -f — это сокращение от --force. Используйте с осторожностью — это может стереть коммиты, отправленные другими людьми, если они работают на той же ветке.
--tags
git push origin --tagsОтправляет все ваши локальные теги в origin. Теги отмечают важные точки в истории, такие как релизы или контрольные точки. Обычная команда git push не передаёт теги, поэтому этот флаг (или отправка конкретного тега с помощью git push origin <tagname>) — единственный способ их опубликовать. Подробнее о создании тегов читайте в разделе git tag.
--all
git push origin --allОтправляет все локальные ветки в origin одной командой. Обратите внимание, что --all не включает теги — если вам нужно и то и другое, выполните отдельную отправку с флагом --tags.
--dry-run
git push --dry-run origin masterИмитирует отправку и сообщает, что было бы передано, не выполняя реальной передачи данных. Полезно для того, чтобы точно узнать, какие коммиты и ссылки будут обновлены, прежде чем выполнять реальную отправку.
--force-with-lease
git push --force-with-lease origin masterПринудительно отправляет master в origin только в том случае, если удалённая ветка всё ещё указывает на то место, где она была при последнем fetch. Если кто-то выполнил отправку в промежутке, команда прерывается вместо того, чтобы перезаписать чужую работу. Это более безопасная альтернатива -f/--force.