Что такое Git push и как его использовать

Что такое git push и как его использовать

В инструкции рассказываем о наиболее частых сценариях использования git push.

Введение

Команда Git push позволяет отправлять локальную ветку на удаленный репозиторий. Она помогает разработчикам синхронизироваться в команде, а именно отправляет проделанные изменения. Если программист работает один, то пуш позволяет хранить код в облаке, например github, gitlab и не только, избавляя от риска потери данных на компьютере.

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

В этой инструкции мы расскажем, как запушить в удаленный git репозиторий. В статье под «пушем» будем подразумевать git push.

Отправка изменений в чистый репозиторий

Перед пушем надо связать локальный и удаленный репозитории. Делается это при помощи команды:

git remote add <repository_name> link

Вместо repository_name нужно дать имя удаленному репозиторию. Далее в инструкции вместо этого параметра мы будем использовать origin, так как чаще всего используют это имя.

Вместо link — ссылка на удаленный репозиторий, она может выглядеть по-разному в зависимости от того используется ssh или https. 

Для ssh, который обязателен для github и gitlab, потребуются сделать дополнительные манипуляции для создания ssh-ключа. Соответствующие инструкции есть на этих ресурсах.

Отправка изменений

Перед пушем надо зафиксировать текущие изменения, то есть сделать git commit.

Далее для отправки в терминале пишем:

git push origin <branch> 

Вместо branch — имя ветки, которую надо отправить. Чаще всего используется master или main: 

git push origin master 

Такое каждый раз писать слишком громоздко, для этого придумали git push по умолчанию. Для этого единожды набираем предыдущую команду с флагом -u:

git push -u origin master

После этого можно писать более коротко, так как git запомнил, что пушить надо на сервер origin ветку под именем master:

git push

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

Дополнительные опции публикации

Отправка ветки на сервер в ветку с другим именем

Для того чтобы сделать git push в другую ветку, есть специальный синтаксис, где после имени ветки через двоеточие пишется имя удаленной ветки:

git push origin branch:server_branch

где branch – имя локальной ветки, server_branch – имя удаленной ветки на сервере.

Отправка всех веток на сервер

Вместо имени ветки пишем  флаг —all: 

git push origin --all

После этого все зафиксированные изменения в ветках отправятся в удаленный репозиторий.

Отправка текущей ветки

Удобный способ отправить текущую ветку с тем же именем на сервере.

git push origin HEAD 

HEAD указывает на текущую ветку (current branch). Тем самым, не надо запоминать имя ветки, на которой вы находитесь.

Принудительная публикация (git push —force …)

При отправке может произойти ошибка публикации:

To github.com:example/test.git
 ! [rejected]        master -> master (fetch first)
error: не удалось отправить некоторые ссылки в «github.com:example/test.git»

Это так называемый git push rejected, он означает что пуш был отклонен. Правильнее всего — сделать то, что написано в подсказке к ошибке. Надо получить и смержить изменения, затем снова отправить. 

Эта ошибка происходит, так как git проверяет, что новый коммит основан на предыдущих коммитах. Пока вы вносили изменения, кто-то мог запушить изменения того же, над чем вы работали. Поэтому git не может выполнить автоматическое слияние, ваш коммит был раньше и он не базируется на обновленных коммитах в удаленном репозиториие. 

Флагом —force или сокращенной его версией -f отключается проверка коммитов и при необходимости выполняется перезапись истории.

git push --force

Нужно быть аккуратными с этой командой, так как она стирает работу других людей. Эта команда оправдана лишь изредка, например, если вы почти сразу внесли изменения коммита с помощью git commit —amend и запушили до того, как кто-то сделал git pull

Принудительная публикация с параметром (git push —force-with-lease …)

Это более безопасный, но так же нерекомендуемый вариант вариант принудительного пушинга. Он не перезапишет работу в удаленной ветке, если в нее были добавлены коммиты от других людей.

git push --force-with-lease

Принудительная публикация с этим параметром чревата появлением git push rejected у других людей

Как пушить в PhpStorm

При первом открытии PhpStorm потребуется создать новый проект.

новый проект

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

часто используемые команды

Синяя стрелка означает git pull, зеленая галочка — git commit, зеленая стрелка — git push. При нажатии на зеленую стрелку (горячие клавиши Ctrl+Alt+K или ⌥ ⌘ K) открывается диалоговое окно с информацией об изменениях и настроках отправки.

Незапушенные коммиты

Самый простой способ узнать про них при помощи команды:  

git status 

Вывод будет содержать имя текущей ветки и то, насколько она опережает версию сервера. Пример вывода:

On branch master
Your branch is ahead of ‘origin/master’ by 1 commit.
  (use “git push” to publish your local commits)

Для более подробной информации можно использовать:

git log 

Будет выведена история коммитов:

commit 0fcd9558b013f642a8c3b4a59a16a66de39c99bd (HEAD -> master)
Author: Pavel <mail@examle.com>
Date:   Sun Mar 27 18:57:14 2022 +0300

    Local commit

commit 289c650767d2c7c2e58486e27b8b3933c6442078 (origin/master, origin/HEAD)
Author: Pavel <mail@example.com>
Date:   Fri Mar 25 19:41:47 2022 +0300

    Pushed commit

В скобках пишется где и какой коммит расположен. 

HEAD -> master означает что текущая ветка (current branch) — это master и это последний локальный коммит в ней.

В нижнем коммите в скобках origin/master означает, что это последний опубликованный коммит на сервере в ветке master, а origin/HEAD, что коммит расположен на ветке, которая совпадает с локальной веткой HEAD.

Как пушить теги

Для создания тегов используют git tag, а для их отправки:

git push origin <tag_name>

Вместо tag_name — имя тега, который надо удалить на сервере.

Также можно сделать отправку всех тегов:

git push --tags

Мы не рекомендуем выбирать этот способ, так как могут отправиться теги, которые были удалены на сервере.

Удаление ветки или тега на сервере

Чтобы удалить ветку на удаленном репозитории, используем уже привычную команду с флагом —delete:

git push --delete origin <remote_branch_or_tag_name>

remote_branch_or_tag_name — имя ветки или тега на сервере.

Для удаление локальной ветки:

git branch -d <branch-name>

А для удаления локального тега:

git tag -d <tag_name>

Продвинутые возможности

Удаление локальных данных (prune)

Если на сервере была удалена ветка, то локально она все еще существует. Чтобы удалить все локальные ветки, которых нет на сервере:

git remote prune origin

Проверить, удастся ли пушинг (dry run option)

С этой опцией пушинг фактически не произойдет, но покажет вывод словно он произошел.

git push --dry-run

Так можно получить ошибку, которая могла бы произойти, и поправить ее заранее.

Атомарный пушинг (atomic option)

Если отправить несколько веток на сервер, некоторые могут быть приняты, а другие — нет. Иногда это не то поведение, которое ожидалось. Например, пушинг делает некоторая проверяющая система и ожидаемое поведение такое: либо все будут приняты, либо все будут отклонены. В таких случаях надо делать пушинг атомарно:

git push --atomic origin branch1 branch2 …

Заключение

В этой инструкции мы рассмотрели наиболее частые сценарии использования git push. В этой команде много опций, некоторые из них даже редко встречаются. Со всеми ними можно ознакомиться в документации:

git push –help