W3docs

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

Основные параметры

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), отправляя в него пустую ссылку.

Как это работает

  1. git push: отправляет изменения из локального репозитория Git в удалённый репозиторий
  2. origin: имя удалённого репозитория
  3. :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.

Практика

Практика
Какие утверждения верны относительно команды 'git push'?
Какие утверждения верны относительно команды 'git push'?
Was this page helpful?