Как работать с пул-реквестами в личном репозитории GitHub

Как работать с пул-реквестами в личном репозитории GitHub

Учимся работать с пул-реквестами на GitHub в личных репозиториях

Введение

Обычно в инструкциях по пул-реквестам (pull request) GitHub рассматривают примеры на базе форков (fork). Мы же попрактикуем работу с пул-реквестом исключительно в пределах личного репозитория.

С одной стороны, работать в личных репозиториях через пул-реквесты кажется избыточным. Куда проще коммитить в репозиторий напрямую.

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

💡
Материал статьи предусматривает знание читателем основ системы контроля версий git

Подготовка репозитория

Перед тем как переходить к пул-реквестам, нам необходимо создать репозиторий с начальным исходным кодом. Пусть это будет проект на C++ и CMake. Я, например, создал самый обычный “Hello World” в среде разработки QtCreator.

Теперь загрузим проект на GitHub. Для этого создадим новый личный репозиторий на GitHub и закоммитим туда наш код.

Идем на GitHub и создаем репозиторий.

На странице создания репозитория вводим его название (у меня это “pr_example”) и жмем “Create repository”.

Пустой репозиторий создан. Теперь, используя подсказки по командам git, загружаем свой проект на GitHub. Эти команды должны быть выполнены в терминале на вашем компьютере в папке проекта. Для удобства я использовал терминал прямо в среде QtCreator.

Рассмотрим команды по порядку. Инициализируем локальный репозиторий в папке проекта:

git init

Теперь нужно добавить файлы проекта в индекс коммита:

git add main.cpp
git add CMakeLists.txt

После добавления файлов делаем первый коммит с сообщением “first commit”:

git commit -m "first commit"

Коммит выполнен, но хранится он только в локальном репозитории. А нам нужно отправить его и на удаленный репозиторий GitHub. Для этого добавим адрес удаленного репозитория GitHub и выполним команду push:

git branch -M main # Переименование главной ветки в "main"
git remote add origin https://github.com/trots/pr_example.git # Здесь используйте ваш адрес репозитория
git push -u origin main

Теперь, обновив страницу вашего репозитория на GitHub, вы увидите загруженные файлы. На этом подготовка репозитория завершена, переходим к работе с пул-реквестами.

Изменение кода в отдельной ветке

Работа с пул-реквестами неразрывно связана с ветками git. Общая идея такая:

  • коммиты не должны выполняться напрямую в ветку main,

  • для работы создается отдельная ветка и коммиты выполняются только в нее.

Итак, переходим в терминал, создаем новую ветку с названием new_feature и переключаемся на нее:

git switch -c new_feature

С помощью команды git branch можно увидеть, что теперь у нас в проекте две ветки.

Теперь внесем изменения в код main.cpp, добавив дополнительные восклицательные знаки к строке “Hello World!!!”. С помощью команды git status можем увидеть, что файл main.cpp перешел в статус измененных.

Закоммитим изменения, предварительно добавив файл в индекс коммита.

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

git add main.cpp # Добавление файла в индекс коммита
git commit -m "second commit"

Коммит в отдельной ветке готов. Отправляем нашу ветку new_feature в удаленный репозиторий на GitHub и можем переходить к пул-реквесту:

git push --set-upstream origin new_feature

Другие способы загрузки кода на GitHub рассмотрены в статье Как загрузить код проекта на GitHub

Работа с пул-реквестом на GitHub

Как только новая ветка загружен на GitHub, ресурс нам сразу же предлагает создать пул-реквест. Воспользуемся предложением.

Создание пул-реквеста требует указания только его названия, которое заполняется автоматически из названия коммита. Остальные параметры можно не заполнять. Хотя я рекомендую проконтролировать, что текущая (compare) и целевая (base) ветки соответствуют ожиданиям, а также опционально можно коротко описать вносимые правки. Для личного репозитория этого достаточно.

Пул-реквест создан и находится в состоянии Open. На этом этапе обычно выполняются контролирующие проверки вносимых правок: как автоматические, так и со стороны специалистов. В нашем же случае мы сразу переходим к слиянию пул-реквеста и нажимаем “Merge pull request”.

Готово, пул-реквест завершен, а наша ветка new_feature слита в ветку main. Теперь ветка new_feature может быть безопасно удалена. Она больше не нужна, ее жизненный цикл окончен.

Возвращаемся обратно в терминал и переключаемся на ветку main. Можно заметить, что на ветке main все еще старый код. Чтобы обновить ветку, нам нужно синхронизировать ее с веткой на GitHub командой pull:

git switch main
git pull

Теперь остается удалить ветку new_feature, которая осталась в локальном репозитории:

git branch -d new_featureя

На этом работа с пул-реквестом завершена.

Выводы

В статье мы попробовали внести изменения в основную ветку проекта main через механизм пул-реквестов. Это хорошее начало перед более вдумчивым и обширным освоением инструмента, так как пул-реквесты (или где-то их называют мердж-реквесты) повсеместно используются в разработке ПО.

Видео-версия текста статьи:


Читайте больше в моем Телеграм канале: Так себе программист