Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Git push: как работает команда и как ее использовать

Миша Курушин
Миша Курушин
Технический писатель
23 марта 2023 г.
11267
6 минут чтения
Средний рейтинг статьи: 5

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

Кстати, это одна из четырех основных команд для управления удаленными репозиториями. Три другие — pull, fetch, remote.

Когда и зачем нужно делать push?

После серии коммитов с ключевыми изменениями нужно обновить кодовую базу в удаленном репозитории. Для этого есть две причины:

  • Сохранение резервной копии на сервере на случай потери данных на локальной машине.
  • Отправка изменений членам команды разработки для синхронизации кодовой базы.

Подготовка перед использованием

Чтобы команда push работала, сперва нужно связать локальный репозиторий с удаленным.

git remote add repository link

Вместо repository указывается название удаленного репозитория — оно может быть произвольным, т.к. используется только на локальной машине. Однако, чаще всего это просто origin.

Вместо link указывается ссылка на удаленный репозиторий. Ее вид зависит от протокола доступа — это может быть как HTTPS, так и SSH.

Как сделать push?

Помните, что перед отправкой обновлений в удаленный репозиторий все локальные изменения нужно зафиксировать командой git commit.

Возможно, на данный момент у вас нет никаких изменений. Чтобы это узнать, воспользуйтесь git status. Если неотправленные на сервер коммиты все-таки имеются, в консоли появится соответствующее сообщение:

Your branch is ahead of 'origin/master' by 3 commits.

В таком случае, свежие изменения необходимо «запушить»:

git push repository branch

Вместо repository указывается название удаленного репозитория, а вместо branch пишется имя ветки, которая будет отправлена. Если на сервере нет такой ветки, то она автоматически будет создана. Чаще всего основную ветку называют master.

git push origin master

Кстати, краткая форма команды отправляет в удаленный репозиторий текущую (т.е. активную) ветку.

git push

Например, если текущей является master, то на сервер отправится именно она. Поэтому всегда выполняйте проверку через git status, чтобы убедиться, что вы находитесь в целевой ветке.

Кстати, ту же операцию можно выполнить, написав более длинную форму команды с указателем HEAD, которые ссылается на активную ветку — таким образом не придется запоминать ее название.

git push origin HEAD

Если после отправки изменений проверить статус через git status, то появится сообщение, что ветка полностью обновлена:

Your branch is up-to-date with 'origin/master'.

Git push в другую ветку

Иногда необходимо поместить локальную ветку в совершенно другую ветку удаленного репозитория. Чтобы это сделать, их названия последовательно указываются через двоеточие.

git push origin master:remote_branch

В данном случае master — название локальной ветки, а remote_branch — аналогичная ветка удаленного репозитория, но с другим именем. Как и с обычным пушем, если remote_branch не существует — Git ее создаст. Если говорить проще, этот вариант команды переименовывает локальную ветку, но в удаленном репозитории.

Git push всех веток сразу

Чтобы отправить сразу все ветки с несохраненными коммитами в удаленный репозиторий, достаточно указать флаг --all вместо привычного имени.

git push origin --all

Git отправит свежие коммиты в соответствующие ветки удаленного репозитория — те, что имеют идентичные имена. Если какие-то из них не существуют, Git их создаст.

Принудительный git push (будьте осторожны!)

В некоторых случаях в удаленном репозитории невозможно выполнить быстрое слияние веток. Поэтому довольно часто ветку просто перезаписывают.

Однако, в целях безопасности Git не позволяет выполнять такую операцию по умолчанию. Например, если в удаленном репозитории есть более свежие коммиты сторонних разработчиков, сперва их необходимо загрузить с помощью pull и выполнить слияние через merge.

Итак, для принудительной перезаписи удаленной ветки к команде push добавляется флаг --force. После этого история коммитов из локального репозитория будет скопирована в удаленный, замещая при этом все предыдущие записи.

git push origin master --force

По этой причине флаг --force требует особой осторожности — принудительная запись может удалить функции, которые были добавлены другими разработчиками. Поэтому использование этого флага считается нежелательным. Идти на такие меры следует только в самом крайнем случае.

Кстати, если предыдущий коммит локального репозитория был исправлен с помощью флага --amend, сделать пуш не получится — исправленный коммит будет отличаться от коммита в удаленном репозитории.

Поэтому придется воспользоваться все тем же флагом --force  — исправленный коммит принудительно перезапишется в удаленный репозиторий.

Отправка тегов

Если в проекте используются теги для пометки версий кодовой базы, то может возникнуть необходимость отправить их в удаленный репозиторий. Дело в том, что Git самостоятельно не отправляет теги на удаленные сервера.

Поэтому, как и с обычными ветками, для этого используется команда git push.

git push origin tagname

Вместо tagname указывается имя тега. Например, если у вас есть тег v1.5, показывающий версию продукта, то команда для его отправки в репозиторий будет выглядеть так:

git push origin v1.5

Как и с ветками, помощью флага --tags в удаленный репозиторий можно отправить все теги сразу.

git push origin --tags

Теперь эти теги будут доступны любому, кто клонирует ваш репозиторий через git clone или получает свежие обновления через git pull.

Удаление ветки или тега в удаленном репозитории

Как ни странно, чтобы стереть ветку в удаленном репозитории, нужно выполнить тот же push, но с другими параметрами.

Пишется все то же самое, как и в случае переименования ветки (т.е. отправки локальной ветки на сервер под другим именем), но без указания названия локальной ветки перед двоеточием.

git push origin :branch_name

Чтобы не запутаться в этой команде, можно представить, что вы отправляете пустоту (вы не указали название локальной ветки) в удаленную ветку, тем самым ее очищая.

Однако, начиная с версии Git v1.7.0 можно использовать флаг --delete, после которого указывается имя удаленной ветки.

git push origin --delete branch_name

Удаление тега ничем не отличается от удаления ветки — вы просто указываете название тега. Работает как способ с двоеточием, так и флаг --delete.

Кстати, Git допускает одновременное удаление сразу нескольких веток или тегов.

git push origin --delete branch_name1 branch_name2 branch_name3

Заключение

В этой статье были показаны основные варианты использования команды git push. Большинство задач, связанных с отправкой данных на сервер, решается с помощью них, и только в редких случая разработчикам приходится прибегать к дополнительным флагам.

Разумеется, более подробную информацию о параметрах этой команды можно найти в официальной документации Git.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону