Перейти к содержимому

git push

Определение

Команда git push загружает содержимое локального репозитория в удалённый репозиторий. Отправка — это противоположность выборки. Если git fetch импортирует содержимое в локальные ветки, то git push экспортирует его в удалённые ветки.

Использование git push

Команда git push обычно используется для публикации локальных изменений в центральном репозитории. После того как изменения внесены в локальный репозиторий, вы можете использовать git push, чтобы поделиться изменениями с другими членами команды. Команда git push — одна из команд, участвующих в процессе «синхронизации». Эти команды работают с удалёнными ветками, настроенными с помощью команды git remote. Коммиты загружаются с помощью git push, а скачиваются с помощью git fetch и git pull. После внесения изменений в обоих случаях для их объединения используется git merge.

Следующие диаграммы показывают, как локальная 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 не отправляет теги.

Как отправлять в bare-репозитории

Отправлять в репозитории, созданные с флагом --bare, очень безопасно, поскольку он не позволяет редактировать файлы и фиксировать изменения в этом репозитории. Рекомендуется создавать центральные репозитории как bare; в противном случае отправка в non-bare-репозиторий может перезаписать изменения.

Принудительная отправка

Git может отклонить ваш запрос на отправку, если история центрального репозитория не совпадает с локальной. В таких случаях следует забрать удалённую ветку и слить её с локальным репозиторием, а затем отправить снова. Флаг --force перезаписывает удалённую ветку локальной, отбрасывая любые изменения upstream, которые ещё не были получены. Используйте принудительную отправку, когда общие коммиты неверны и исправляются с помощью git commit --amend или интерактивного rebase. Перед использованием параметра --force убедитесь, что никто не забрал эти коммиты. Интерактивный rebase — также хороший способ привести коммиты в порядок перед публикацией. Команда git commit --amend обновляет предыдущий коммит. Когда коммит изменён, git push завершится ошибкой, потому что Git будет считать изменённый коммит и удалённый коммит разошедшимся содержимым. В этом случае для отправки изменённого коммита нужно использовать --force.

git push --force

bash
# 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

bash
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. Обычно при использовании этого флага вы увидите такой вариант:

Use -u flag for the first push on a branch

bash
git push -u origin your-branch-name

Примеры некоторых наиболее часто используемых флагов:

Вот несколько примеров того, как использовать некоторые флаги git push:

Флаг -f:


bash
git push -f origin master

Это принудительно отправит локальную ветку master в удалённый репозиторий origin, перезаписав любые изменения, которые могли быть внесены в ветку master в удалённом репозитории. Используйте этот флаг с осторожностью, так как он может вызвать проблемы, если над одной и той же веткой работают несколько человек.

Флаг --tags:


bash
git push --tags origin

Это отправит все теги в удалённый репозиторий origin. Теги используются для обозначения важных точек в истории вашего проекта, таких как релизы или вехи.

Флаг --all:


bash
git push --all origin

Это отправит все локальные ветки в удалённый репозиторий origin.

Флаг --dry-run:


bash
git push --dry-run origin master

Это имитирует отправку в ветку master удалённого репозитория origin, фактически ничего не отправляя. Это может быть полезно для тестирования и проверки того, какие изменения будут отправлены, прежде чем действительно их отправлять.

Флаг --force-with-lease:


bash
git push --force-with-lease origin master

Это принудительно отправит локальную ветку master в удалённый репозиторий origin, при этом гарантируя, что вы не перезапишете изменения, которые могли быть внесены в ветку master в удалённом репозитории с момента вашей последней загрузки. Это более безопасная альтернатива использованию флага -f.

Практика

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

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.