Git push
Команда git push
используется для выгрузки содержимого локального репозитория в удаленный репозиторий. Она позволяет передать коммиты из локального репозитория в удаленный. Эта команда симметрична команде git fetch
: при извлечении с помощью fetch коммиты импортируются в локальные ветки, а при публикации с помощью push коммиты экспортируются в удаленные ветки. Настроить удаленные ветки можно с помощью команды git remote
. Команда push может перезаписать изменения, поэтому при ее использовании следует соблюдать осторожность. Эти проблемы обсуждаются ниже.
Использование git push
git push <remote> <branch>
Публикация указанной ветки в удаленном репозитории
git push <remote> --force
Аналогично приведенной выше команде, однако данные будут опубликованы принудительно, даже если нельзя выполнить ускоренное слияние. Не используйте флаг --force
, если вы не уверены в своих действиях.
git push <remote> --all
Публикация всех локальных веток в указанном удаленном репозитории.
git push <remote> --tags
При публикации ветки или использовании опции --all
теги не публикуются автоматически. Флаг --tags
отправляет все локальные теги в удаленный репозиторий.
Обсуждение git push
Команда git push
чаще всего используется для публикации выгружаемых локальных изменений в центральном репозитории. Для того чтобы поделиться изменениями, внесенными в локальный репозиторий, с удаленными участниками команды, необходимо выполнить команду push.
На рисунке выше показано, что происходит, когда ваша локальная ветка master
изменяет предыдущие коммиты ветки master
центрального репозитория и вы публикуете изменения с помощью команды git push origin master
. Обратите внимание, что команда git push
по сути аналогична команде git merge master
, запущенной из удаленного репозитория.
Git push и синхронизация
Команда git push
— это один из многих компонентов, которые используются в общем процессе синхронизации в Git. Команды синхронизации работают с удаленными ветками, которые настраиваются с помощью команды git remote
. Команду git push
можно рассматривать как команду «выгрузки», а команды git fetch
и git pull
— как команды «загрузки». После того как наборы изменений перемещены посредством «загрузки» или «выгрузки», в месте назначения можно интегрировать изменения, выполнив их слияние командой git merge
.
Публикация в чистые репозитории
В настоящее время в качестве центрального исходного репозитория Git часто используют удаленно размещенный чистый (--bare
) репозиторий. Этот исходный репозиторий размещается за пределами рабочего места у доверенной третьей стороны, например в Bitbucket. Поскольку при публикации нарушается структура удаленных веток, наиболее безопасный и распространенный вариант публикации — это публикация в репозиторий, созданный с флагом --bare
. Чистые репозитории не имеют рабочего каталога, поэтому при публикации содержимое рабочего каталога не изменяется. Дополнительную информацию о создании чистых репозиториев см. в документации по команде git init
.
Принудительная публикация
Git предотвращает перезапись истории центрального репозитория, отклоняя push-запросы, если нельзя выполнить их ускоренное слияние. Так, если история удаленного репозитория отличается от вашей истории, необходимо загрузить удаленную ветку командой pull и выполнить ее слияние с локальной веткой командой merge, а затем попробовать выполнить команду push еще раз. Это похоже на то, как в SVN необходимо синхронизироваться с центральным репозиторием с помощью команды svn update
перед тем, как сделать коммит набора изменений.
Флаг --force
отменяет это поведение и подгоняет ветку удаленного репозитория под вашу локальную ветку, удаляя любые вышестоящие изменения, которые могли быть внесены с момента последнего выполнения вами команды pull. Принудительное использование команды push оправдано лишь в том случае, когда вы понимаете, что только что опубликованные вами коммиты были не совсем правильными и вы исправили их с помощью команды git commit --amend
или интерактивного перебазирования. При этом прежде, чем использовать опцию --force
, вы должны быть абсолютно уверены в том, что никто из участников вашей команды не забирал эти коммиты с помощью команды pull.
Примеры
Команда git push по умолчанию
В следующем примере приведен один из стандартных методов публикации локальных вкладов в центральный репозиторий с помощью команды push. Сначала проверяется актуальность вашей локальной главной ветки путем извлечения копии центрального репозитория и перебазирования ваших изменений поверх них. Кроме того, интерактивное перебазирование — это хорошая возможность очистить ваши коммиты перед тем, как делиться ими. Затем все коммиты вашей локальной главной ветки отправляются в центральный репозиторий с помощью команды git push
.
git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master
Поскольку мы уже убедились, что локальная главная ветка была обновлена, должно произойти ускоренное слияние, а команда git push
не должна сообщать о каких-либо описанных выше проблемах, связанных с невозможностью выполнения такого слияния.
Принудительная команда push при исправлении коммитов
Команда git commit
имеет опцию --amend
, которая позволяет обновить предыдущий коммит. В коммиты часто вносятся исправления, чтобы обновить сообщение коммита или добавить новые изменения. Если коммит был исправлен, то при выполнении команды git push
произойдет сбой, так как Git воспримет исправленный и удаленный коммиты как разнородное содержимое. Опция --force
позволит выполнить команду push и опубликовать измененный коммит.
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master
В приведенном выше примере предполагается, что он выполняется в существующем репозитории с историей коммитов. Команда git commit --amend
используется для обновления предыдущего коммита. Затем исправленный коммит принудительно публикуется с помощью команды push с опцией --force
.
Стирание удаленной ветки или тега
Иногда ветки необходимо чистить для наведения порядка. Чтобы полностью стереть ветку, ее необходимо стереть как в локальном репозитории, так и в удаленном.
git branch -D branch_name
git push origin :branch_name
Первая команда сотрет локальную ветку с именем branch_name. Если в команде git push
перед именем ветки поставить двоеточие, будет стерта удаленная ветка.