Git push
Команда git push
используется для выгрузки содержимого локального репозитория в удаленный репозиторий. Она позволяет передать коммиты из локального репозитория в удаленный. Эта команда симметрична git fetch: при извлечении с помощью fetch коммиты импортируются в локальные ветки, а при публикации с помощью push происходит экспорт в удаленные ветки. Настроить удаленные ветки можно с помощью git remote. Команда push может перезаписать изменения, поэтому при ее использовании следует соблюдать осторожность. Эти проблемы обсуждаются ниже.
Использование git push
git push <remote> <branch>
Так выполняется публикация указанной ветки вместе со всеми необходимыми коммитами и внутренними объектами. Эта команда создает локальную ветку в репозитории назначения. Чтобы предотвратить перезапись коммитов, система Git не позволит опубликовать данные, если в репозитории назначения нельзя выполнить ускоренное слияние.
git push <remote> --force
Аналогично приведенной выше команде, однако данные будут опубликованы принудительно, даже если нельзя выполнить ускоренное слияние. Не используйте флаг --force
, если вы не уверены в своих действиях.
Публикация всех локальных веток в указанном удаленном репозитории.
git push <remote> --tags
Связанные материалы
Расширенный журнал Git
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
При публикации ветки или использовании опции --all
теги не публикуются автоматически. Флаг --tags
отправляет все локальные теги в удаленный репозиторий.
Обсуждение git push
Команда git push
чаще всего используется для публикации выгружаемых локальных изменений в центральном репозитории. Для того чтобы поделиться изменениями, внесенными в локальный репозиторий, с удаленными участниками команды, необходимо выполнить команду push.
На рисунке выше показано, что происходит, когда ваша локальная ветка main
изменяет предыдущие коммиты ветки main
центрального репозитория и вы публикуете изменения с помощью команды git push origin main
. Обратите внимание, что команда git push
по сути аналогична команде git merge main
, запущенной из удаленного репозитория.
Git push и синхронизация
Команда git push
— это один из многих компонентов, которые используются в общем процессе синхронизации в Git. Команды синхронизации работают с удаленными ветками, которые настраиваются с помощью git remote. Команду git push
можно рассматривать как команду выгрузки, а git fetch и git pull — как команды загрузки (скачивания). После того как наборы изменений перемещены посредством загрузки или выгрузки, в месте назначения можно интегрировать изменения, выполнив их слияние командой git merge.
Публикация в чистые репозитории
В настоящее время в качестве центрального исходного репозитория Git часто используют удаленно размещенный чистый (--bare
) репозиторий. Этот исходный репозиторий (origin) размещается у надежного стороннего поставщика, например в Bitbucket. Поскольку при публикации нарушается структура удаленных веток, наиболее безопасный и распространенный вариант — это публикация в репозитории, созданном с флагом --bare
. Чистые репозитории не имеют рабочего каталога, поэтому публикация не может изменить его содержимое. Подробнее о создании чистых репозиториев см. в документации по команде git init.
Принудительная публикация
Git предотвращает перезапись истории центрального репозитория, отклоняя push-запросы, если нельзя выполнить их ускоренное слияние. Так, если история удаленного репозитория отличается от вашей истории, необходимо загрузить удаленную ветку командой pull и выполнить ее слияние с локальной веткой командой merge, а затем попробовать выполнить команду push еще раз. Это похоже на то, как в SVN необходимо синхронизироваться с центральным репозиторием с помощью команды svn update
перед тем, как сделать коммит набора изменений.
Флаг --force
отменяет это поведение и подгоняет ветку удаленного репозитория под вашу локальную ветку, удаляя любые вышестоящие изменения, которые могли быть внесены с момента последнего выполнения вами команды pull. Принудительное использование команды push оправдано лишь в том случае, когда вы понимаете, что только что опубликованные вами коммиты были не совсем правильными и вы исправили их с помощью команды git commit --amend
или интерактивного перебазирования. При этом прежде, чем использовать опцию --force
, вы должны быть абсолютно уверены в том, что никто из участников вашей команды не забирал эти коммиты с помощью команды pull.
Примеры
Команда git push по умолчанию
В следующем примере рассматривается один из стандартных способов публикации локальных изменений в центральном репозитории. Сначала проверяется актуальность вашей локальной основной ветки. Для этого извлекается копия центрального репозитория, после чего поверх нее перебазируются ваши изменения. Кстати, с помощью интерактивного перебазирования можно удобно очистить коммиты перед тем, как делиться ими. Затем все коммиты вашей локальной основной ветки отправляются в центральный репозиторий с помощью команды git push
.
git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main
Мы убедились в том, что локальная основная ветка включает все актуальные изменения, поэтому слияние должно пройти в упрощенном режиме, а команда 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 main
Предполагается, что приведенный выше пример выполняется в существующем репозитории с историей коммитов. Команда git commit --amend
используется для обновления предыдущего коммита. Затем исправленный коммит принудительно публикуется с помощью команды push с параметром --force
.
Стирание удаленной ветки или тега
Иногда ветки необходимо чистить для наведения порядка. Чтобы полностью стереть ветку, ее необходимо стереть как в локальном репозитории, так и в удаленном.
git branch -D branch_name
git push origin :branch_name
Первая команда сотрет локальную ветку с именем branch_name. Если в команде git push
перед именем ветки поставить двоеточие, будет стерта удаленная ветка.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.