A3.5 Приложение C: Команды Git — Совместная работа и обновление проектов
Не так уж много команд в Git требуют сетевого подключения для своей работы, практически все команды оперируют с локальной копией проекта. Когда вы готовы поделиться своими наработками, всего несколько команд помогут вам работать с удалёнными репозиториями.
git fetch
Команда git fetch связывается с удалённым репозиторием и забирает из него все изменения, которых у вас пока нет и сохраняет их локально.
Мы познакомились с ней в разделе Получение изменений из удалённого репозитория — Fetch и Pull главы 2 и продолжили знакомство в разделе Удалённые ветки главы 3.
Мы использовали эту команду в нескольких примерах из раздела Участие в проекте.
Мы использовали её для скачивания запросов на слияние (pull request) из других репозиториев в разделе Ссылки на запрос слияния главы 6, также мы рассмотрели использование git fetch для работы с упакованными репозиториями в разделе Создание пакетов главы 7.
Мы рассмотрели тонкую настройку git fetch в главе и Спецификации ссылок.
git pull
Команда git pull работает как комбинация команд git fetch и git merge , т. е. Git вначале забирает изменения из указанного удалённого репозитория, а затем пытается слить их с текущей веткой.
Мы познакомились с ней в разделе Получение изменений из удалённого репозитория — Fetch и Pull главы 2 и показали как узнать, какие изменения будут приняты в случае применения в разделе Просмотр удалённого репозитория главы 2.
Мы также увидели как она может оказаться полезной для разрешения сложностей при перемещении веток в разделе Меняя базу, меняй основание главы 3.
Мы показали как можно использовать только URL удалённого репозитория без сохранения его в списке удалённых репозиториев в разделе Извлечение удалённых веток главы 5.
И наконец мы показали как проверять криптографические подписи полученных коммитов, используя опцию —verify-signatures в разделе Подпись коммитов главы 7.
git push
Команда git push используется для установления связи с удалённым репозиторием, вычисления локальных изменений отсутствующих в нём, и собственно их передачи в вышеупомянутый репозиторий. Этой команде нужно право на запись в репозиторий, поэтому она использует аутентификацию.
Мы познакомились с этой командой в разделе Отправка изменений в удалённый репозиторий (Push) главы 2. Там мы рассмотрели основы обновления веток в удалённом репозитории. В разделе Отправка изменений главы 3 мы подробнее познакомились с этой командой, а в разделе Отслеживание веток главы 3 мы узнали как настроить отслеживание веток для автоматической передачи на удалённый репозиторий. В разделе Удаление веток на удалённом сервере главы 3 мы использовали флаг —delete для удаления веток на сервере, используя git push .
На протяжении раздела Участие в проекте мы показали несколько примеров использования git push для совместной работы в нескольких удалённых репозиториях одновременно.
В разделе Публикация изменений подмодуля главы 7 мы использовали опцию —recurse-submodules чтобы удостовериться, что все подмодули будут опубликованы перед отправкой проекта на сервер, что может быть реально полезным при работе с репозиториями, содержащими подмодули.
В разделе Прочие хуки на стороне клиента главы 8 мы поговорили о триггере pre-push , который может быть выполнен перед отправкой данных, чтобы проверить возможность этой отправки.
Наконец, в разделе Спецификации ссылок для отправки данных на сервер главы 10 мы рассмотрели передачу данных с полным указанием передаваемых ссылок, вместо использования распространённых сокращений. Это может быть полезным если вы хотите очень точно указать, какими изменениями хотите поделиться.
git remote
Команда git remote служит для управления списком удалённых репозиториев. Она позволяет сохранять длинные URL репозиториев в виде понятных коротких строк, например «origin», так что вам не придётся забивать голову всякой ерундой и набирать её каждый раз для связи с сервером. Вы можете использовать несколько удалённых репозиториев для работы и git remote поможет добавлять, изменять и удалять их.
Эта команда детально рассмотрена в разделе Работа с удалёнными репозиториями главы 2, включая вывод списка удалённых репозиториев, добавление новых, удаление или переименование существующих.
Она используется практически в каждой главе, но всегда в одном и том же виде: git remote add .
git archive
Команда git archive используется для упаковки в архив указанных коммитов или всего репозитория.
Мы использовали git archive для создания тарбола ( tar.gz файла) всего проекта для передачи по сети в разделе Подготовка релиза главы 5.
git submodule
Команда git submodule используется для управления вложенными репозиториями. Например, это могут быть библиотеки или другие, используемые не только в этом проекте ресурсы. У команды submodule есть несколько под-команд — add , update , sync и др. — для управления такими репозиториями.
Эта команда упомянута и полностью раскрыта в разделе Подмодули главы 7.
Git для начинающих. Урок 6.
git push и git pull
Краткое содержание урока, основные инструкции для командной строки, полезные ссылки и советы.
Во втором уроке мы создавали репозитории на github и научились клонировать их. После этого мы работали только с локальным репозиторием, на своей машине. Сегодня мы рассмотрим взаимодействие с удаленным репозиторием.
Что такое push (пуш)
Это отправка данных на сервер, в удаленный репозиторий, на github. Данные — это коммиты и ветки.
Зачем пушить на сервер
- для работы в команде, чтобы делиться своим кодом с коллегами
- чтобы иметь резервную копию на случай потери данных на своей машине
Когда пушить на сервер
Когда сделали новый коммит или несколько коммитов
Как узнать, что есть незапушенные коммиты
В командной строке набрать git status
$ git status On branch master $ git status On branch master Your branch is ahead of 'origin/master' by 5 commits. (use "git push" to publish your local commits) (use "git push" to publish your local commits)
Ключевая фраза здесь «Your branch is ahead of ‘origin/master’ by 5 commits.». Это значит, что у нас есть 5 неотправленных на сервер коммитов. Если незапушенных коммитов нет, то картина будет такая
$ git status On branch master Your branch is up-to-date with 'origin/master'.
«is up-to-date» означает, что у нас нет незапушенных коммитов
В PhpStorm понять, есть ли неотправленные коммиты, можно посмотрев в окно Version Control — Log, где находятся метка master и origin/master. Если master выше, то есть незапушенные коммиты.
master и origin/master
Это ветки: локальная и удаленная (на сервере, в github). По умолчанию мы находимся в ветке master. Подробно работу с ветками мы рассмотрим в следующем уроке, а пока достаточно запомнить, что master — это то, что на нашей машине, а origin/master — в удаленном репозитории, на github.
git push в терминале
$ git push origin master
- push — что сделать, отправить
- origin — куда, на сервер
- master — что, ветку master
Как пушить в PhpStorm
Правый клик — Git — Repository — Push. — Кнопка Push
Что такое pull (пулл)
Это скачивание данных с сервера. Похоже на клонирование репозитория, но с той разницей, что скачиваются не все коммиты, а только новые.
Зачем пулиться с сервера
Чтобы получать изменения от ваших коллег. Или от себя самого, если работаете на разных машинах
git pull в терминале
$ git pull origin master
- pull — что сделать, получить данные
- origin — откуда, с сервера
- master — а точнее, с ветки master
Как пулить в PhpStorm
Правый клик — Git — Repository — Pull. — Кнопка Pull
Когда что-то пошло не так.
Иногда при работе в команде git push и git pull могут вести себя не так, как пишут в учебниках. Рассмотрим примеры
git push rejected
Вы сделали новый коммит, пытаетесь запушить его, а git в ответ выдает такое
$ git push origin master To git@github.com:Webdevkin/site-git.git ! [rejected] master -> master (fetch first) error: failed to push some refs to 'git@github.com:Webdevkin/site-git.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull . ') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Написано много, но суть в том, что коммит отклонен, пуш не прошел. Почему?
Git устроен так, что локально мы можем коммитить сколько угодно. Но прежде чем отправить свои коммиты на сервер, то есть запушить, нужно подтянуть новые коммиты с сервера. Те самые, которые успели сделать наши коллеги. То есть сделать git pull.
Когда мы делаем git push, git сначала проверяет, а нет ли на сервере новых коммитов. Если они есть, то git выдает то самое сообщение — git push rejected. Значит, нам нужно сначала сделать git pull, а затем снова запушить
$ git pull origin master remote: Enumerating objects: 4, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done. From github.com:Webdevkin/site-git * branch master -> FETCH_HEAD 239892a..383b385 master -> origin/master Merge made by the 'recursive' strategy. README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md
Здесь нас подстерегает неожиданность — в терминале выскакивает окно редактирования коммита. Пока просто сохраним, что предложено по умолчанию и закроем редактор. Вот теперь можно пушить свои коммиты
$ git push origin master Counting objects: 19, done. Delta compression using up to 4 threads. Compressing objects: 100% (17/17), done. Writing objects: 100% (19/19), 1.98 KiB | 0 bytes/s, done. Total 19 (delta 4), reused 0 (delta 0) remote: Resolving deltas: 100% (4/4), completed with 1 local object. To git@github.com:Webdevkin/site-git.git 383b385..f32b91e master -> master
Все, наши коммиты на сервере. При этом появится странный коммит «Merge branch ‘master’ of github.com:Webdevkin/site-git». Это так называемый мердж-коммит, о нем чуть ниже.
Если же при попытке пуша новых коммитов на сервере нет, то git push пройдет сразу и отправит наши коммиты на сервер.
Как избавиться от мердж-коммита
Мердж-коммит появляется, когда вы сделали локальный коммит, а после этого подтянули новые коммиты с сервера. Мердж-коммит не несет смысловой информации, кроме самого факта мерджа. Без него история коммитов выглядит чище.
Чтобы избавиться от него, подтягивайте изменения командой git pull с флажком —rebase
$ git pull --rebase origin master
При этом ваш локальный коммит окажется «поверх» нового коммита с сервера, а мердж-коммита не будет. И не забудьте после этого запушить свой коммит на сервер.
Мердж-коммит в PhpStorm
PhpStorm помогает избавиться от мердж-коммитов через меньшее количество действий. Если мы запушим локальные коммиты и получим rejected из-за того, что на сервере есть новые коммиты, то PhpStorm выдаст предупреждение, где предложит выбрать вариант: как подтянуть новые коммиты, с мерждем или ребейзом. Жмите кнопку «Rebase», мердж-коммита не будет и при этом локальный коммит сразу запушится на сервер.
Внимание
Объяснения в тексте не передают точно возникающие проблемы, это нужно видеть в динамике. Поэтому лучше смотрите видеоуроки и еще лучше пробуйте сами повторять их содержание.
Что могу посоветовать
Если мы работаем в одиночку, то удаленный репозиторий нужен только для сохранения резевной копии. Скорее всего, мы будем в него только пушить.
Но при работе в команде имеет смысл подумать над такими вещами:
- пушить коммиты почаще, чтобы коллеги быстрее получали доступ к новым изменениям
- пулиться почаще — обратная ситуация, почаще получать свежие изменения
- всегда пультесь с флажком ребейза — git pull —rebase origin master
- не удивляйтесь, что при пуллах и пушах могут возникать подобные ситуации, как мы рассматривали выше
- не стесняйтесь спрашивать коллег, если увидели незнакомую ситуацию
- больше практикуйтесь. Посадите домашний проект на git и работайте с ним
Не переживайте, если иногда будете чувствовать себя, как друзья ниже. Это нормально, новый инструмент не осваивается за 5 минут. Немного практики, и мы будем понимать, почему иногда git ведет себя не так, как хочется, и главное, будем понимать, как это исправить.

В следующем уроке мы узнаем, что такое ветки и будем активно работать с ними. Там мы будем активно использовать git push и git pull, и это поможет закрепить уже пройденный материал.
Спасибо за внимание и до встречи!
Все уроки курса
- Вводный урок
- 1. Установка и базовая настройка git
- 2. Создание и клонирование репозитория git
- 3. Делаем первые изменения, git status и git diff
- 4. Коммиты и история коммитов, git commit, git log и git show
- 5. Подробнее об истории коммитов. Путешествие по истории
- 6. Работа с сервером, git push и git pull
- 7. Ветки — главная фишка git, git branch и git checkout
- 8. Работа с ветками на сервере, git fetch
- 9. Слияния или мерджи веток, git merge
- 10. Конфликты и их разрешение
- Платная часть курса. Презентация
- * 11. Работа с gitignore и git exclude
- * 12. Буфер обмена git, git stash
- * 13. Копирование коммитов, git cherry-pick
- * 14. Отмена и редактирование последнего коммита
- * 15. Отмена произвольного коммита, git revert
- 16. Склеивание коммитов, git rebase —interactive и git reflog
- * 17. Зачем склеивать коммиты. Плюсы и минусы сквоша
- * 18. Работа с git rebase. Отличия от merge
- * 19. Что такое git push —force и как с ним работать
- * 20. Ищем баги с помощью git, git bisect
- * 21. Как и зачем работать с тегами git
- * 22. Процессы: github flow и git flow
- * 23. Псевдонимы в git
- 24. Мердж-реквесты
- * 25. Форки
Git push — что это такое

Git push — это консольная команда, которая передаёт в удалённый репозиторий изменения, сделанные в локальном репозитории. С помощью этой консольной команды разработчики дорабатывают основную ветку, добавляя новые фичи и внося исправления найденных багов и уязвимостей. Это удобно и при работе в одиночку — можно хранить свой код в облаке.
Теперь раскроем тему более подробно.
Что есть Git
Git-репозиторий — это набор файлов, которые хранятся в папке .git. Просто набор файлов, и ничего более.
Git сохраняет в commit (коммит) содержимое всех файлов, сохраняя изменения в objects. Если файл не менялся, используется старый objects. Получается, что в коммит попадают только те файлы, в которые вносились исправления. Это экономит место в хранилище, ускоряет процесс обновления и позволяет в любой момент переключиться на нужный коммит, так как все коммиты видны в истории изменений.
Благодаря Git разработчикам проще откатить свой проект на более старую версию, если что-то пошло не так. Также они могут сравнивать, анализировать или выгружать сделанные изменения в удалённый репозиторий.
Аренда облачного сервера для разработки, хостинга, обученияПодробнее
Git push и все-все-все
Итак, команда git push необходима для передачи содержимого локального репозитория в центральный, к которому имеют доступ другие разработчики из команды. С ней нужно быть осторожным, пушить в репозиторий стоит лишь в том случае, когда вы твёрдо уверены том, что готовы перезаписать основную ветку. В обратном порядке работает команда git fetch: она импортирует коммиты из основного репозитория в локальные.
Если упростить, то процесс отправки пушей выглядит так:
git push origin master
- Действие: push, отправить
- Адресат: origin, сервер
- Объект: master, имя ветки
Как ещё можно использовать команду git push?
git remote add link
Начать нужно с организации связей между репозиториями. Эта команда связывает локальную и центральную ветки. Вместо repository_name указываете имя репозитория (как правило, это origin), а вместо link — URL-адрес. Только после этой команды ваш пуш будет уходить в нужную ветку.
Команда отправки на публикацию выбранной ветки в удалённый репозитории (включая все коммиты и внутренние объекты). При этом создаётся локальная ветка в конечном репозитории. В целях защиты коммитов от перезаписи Git не позволяет публиковать данные, если в конечном репозитории невозможно выполнить быстрое слияние веток.
Команда идентична приведённой выше с тем лишь отличием, что данные будут опубликованы в любом случае. Даже если ускоренное слияние выполнить невозможно. Используйте эту команду с осторожностью, так как принудительная перезапись способна удалить результат работы других людей.
Отправка всех локальных веток на публикацию в удалённом репозитории.
git branch -D branch_name или git push origin :branch_name
Чтобы навести порядок, репозитории иногда нужно чистить. Вы можете полностью стереть ветку branch_name в локальном репозитории при помощи первой команды. Или стереть удалённую ветку — введя в консоли вторую команду.
Git умеет и показывать незапушенные коммиты. Чтобы их посмотреть, введите команду
В ответ на эту команду терминал выдаст ответ вроде такого:
On branch master
Your branch is ahead of ‘origin/master’ by 3 commits.
(use «git push» to publish your local commits)
Это значит, что три коммита ещё не запушены, а предлагаемые в них изменения не внесены в репозиторий.
А что ещё можно делать с Git?
Удалять локальные данные и ветки, которых нет в центральном репозитории, добавлять и удалять теги на сервере, просматривать все удалённые репозитории, и каждый из них в отдельности. В Git есть большое количество инструментов, которые упрощают разработку и позволяют быстрее выкатывать конечный продукт. Чтобы увидеть весь перечень команд, поддерживаемых Git, введите в консоли команду
Зачем нужна команда Git push
Команда git push создана для управления удаленными репозиториями. Она необходима, когда вы хотите поделиться изменениями с другими участниками проекта или сохранить их в центральном репозитории.
Выполнение команды git push синхронизирует локальный и удаленный репозитории. Если вы работаете с несколькими устройствами, выполнение команды git push позволяет сохранить изменения в центральном репозитории и получать доступ к обновленным данным по проекту с любого устройства.

Какую функцию выполняет команда git-push
Когда вы совершаете изменения в локальном репозитории Git, например, создаете новый коммит или добавляете файлы, изменения применяются только локально. Чтобы отправить их на удаленный репозиторий, необходимо использовать команду git push.
Выполнение команды git push позволяет сохранить историю изменений, которые были сделаны локально, в удаленном репозитории. Это помогает отслеживать изменения, сделанные другими участниками проекта, и управлять версиями проекта.
Зачем нужно выполнить push
Команда git push может быть использована в нескольких сценариях:
- Если вы работаете в команде, и ваше изменение было недоступно для других разработчиков, пока вы локально не создали запрос на отправку изменений (push request) на удаленный репозиторий. После того, как вы отправили свои изменения на удаленный репозиторий, они становятся доступными для других разработчиков, которые могут создать запрос на объединение вашего кода (pull request).
- Также команда git push может быть использована для регулярных резервных копий вашего кода, чтобы не оставаться без данных в случае потери информации на локальном компьютере.

Надежное и качественное оборудование для проектов разработки и тестирования – услуга Аренда выделенного сервера.
Основные варианты использования команды git push

- Отправка изменений на удаленный репозиторий, для использования другими разработчиками.
- Создание резервной копии репозитория на удаленном сервере. Это позволит не потерять свой код в случае ошибки на локальном компьютере.
- Деплоймент исходного кода на удаленный сервер. Команда git push может использоваться для автоматического развертывания исходного кода на удаленном сервере после каждого коммита.
- Создание резервной копии репозитория на удаленном сервере в облаке, таком как GitHub или GitLab.
- Создание веток в удаленном репозитории.
- Обновление документации или веб-страниц на удаленном сервере.
В целом, команда git push предоставляет разработчикам широкие возможности для отправки изменений на удаленный репозиторий и управления версиями кода. Рассмотрим различные варианты выполнение команды git push.
Как выполнить push
Параметры команды git push выглядит следующим образом:
git push remote_name remote_branch_name
remote_name – имя удаленного репозитория,
remote_branch_name – имя ветки, в которую вы хотите отправить изменения.
Например, чтобы отправить изменения в ветку Main в удаленный репозиторий Origin, нужно выполнить следующую команду:
git push origin main
Перед отправкой изменений выполните несколько шагов:
- Убедитесь, что вы находитесь в локальной ветке, которую хотите отправить в удалённый репозиторий. Для этого можно использовать команду git branch, чтобы увидеть список доступных веток, и команду git checkout, чтобы переключиться на нужную ветку.
- Сделайте коммит изменений, которые вы хотите отправить, используя команду git commit. В комментарии к коммиту можно описать, какие изменения были внесены.
Git push в другую ветку
Для того, чтобы выполнить команду git push в другую ветку, необходимо указать название удаленного репозитория, на который нужно отправить изменения, и название ветки, в которую нужно отправить изменения. Синтаксис команды выглядит следующим образом:
git push remote_name local_branch_name:remote_branch_name
remote_name – название удаленного репозитория,
local_branch_name – название локальной ветки, которую вы хотите отправить, remote_branch_name – название удаленной ветки, в которую вы хотите отправить изменения. Важно отметить, что если удаленная ветка с указанным именем не существует, она будет создана автоматически.
Если вы используете команду git push в другую ветку, обратите внимание на то, чтобы не затереть изменения, которые уже находятся в удаленной ветке. Рекомендуем всегда синхронизировать свой локальный репозиторий с удаленным репозиторием.
Git push всех веток сразу
Чтобы выполнить git push всех веток сразу сделайте коммит изменений, которые вы хотите отправить в удаленный репозиторий, используя команду git commit.
Затем выполните команду git push remote_name —all
remote_name – название удаленного репозитория.
Git отправит изменения в удаленный репозиторий и выведет информацию о выполненной операции.
Git: отправить теги на удаленные сервера
Отправка тегов на удаленный сервер может быть полезна, когда вы выпустили новую версию вашего проекта и хотите отметить этот момент с помощью тега. Для отправки тегов на удаленный сервер используйте команду:
git push remote_name tag_name
remote_name – название удаленного репозитория,
tag_name –название тега.
Например, для отправки тега v1.0.0 на удаленный репозиторий origin необходимо выполнить команду:
git push origin v1.0.0
Если на удаленном репозитории не существует такого тега, то он будет создан.
Также можно отправить все теги сразу на удаленный сервер с помощью команды:
git push —tags remote_name
remote_name – название удаленного репозитория.
Эта команда отправит все теги из локального репозитория на указанный удаленный репозиторий.
Удаление ветки
Для удаление локальной ветки используется команда git branch -d, например:
git branch -d branch_name
branch_name — имя ветки, которую нужно удалить.
d – означаете удалить (delete).
Если ветка не была слита с другой веткой, то команда git branch -d выведет предупреждение, что ветка не была полностью слита, и удаление не будет выполнено. В этом случае можно использовать команду git branch -D, чтобы принудительно удалить ветку:
git branch -D branch_name
Чтобы удалить ветку в удаленном репозитории, используйте команду вида:
git push remote_name —delete remote_branch_name
remote_name – название удаленного репозитория,
remote_branch_name – название удаленной ветки, которую вы хотите удалить.
Можно использовать еще одну команду, возможно, ее запомнить чуть сложнее:
git push remote_name :remote_branch_name
Используя этот синтаксис, вы можете удалять теги или несколько веток и тегов одновременно, разделяя их названия пробелами:
git push remote_name —delete remote_branch_name1 remote_branch_name2 remote_branch_name3
Заключение
Команда git push является важным инструментом для разработки программного обеспечения и управления версиями. Она позволяет эффективно работать в команде, сохранять копии кода на удаленном репозитории и действовать в соответствии с лучшими практиками разработки программного обеспечения.