Close

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

Логотип Bitbucket
СМ. РЕШЕНИЕ

Изучите Git с помощью Bitbucket Cloud

При публикации ветки или использовании опции --all теги не публикуются автоматически. Флаг --tags отправляет все локальные теги в удаленный репозиторий.

Обсуждение git push


Команда git push чаще всего используется для публикации выгружаемых локальных изменений в центральном репозитории. Для того чтобы поделиться изменениями, внесенными в локальный репозиторий, с удаленными участниками команды, необходимо выполнить команду push.

Использование git 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.

Люди сотрудничают друг с другом, используя стену со множеством инструментов

Блог Bitbucket

Рисунок: DevOps

Образовательные программы DevOps

Демонстрация функций в демо-зале с участием экспертов Atlassian

Как инструмент Bitbucket Cloud работает с Atlassian Open DevOps

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up