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


Введение
Обычно в инструкциях по пул-реквестам (pull request) GitHub рассматривают примеры на базе форков (fork). Мы же попрактикуем работу с пул-реквестом исключительно в пределах личного репозитория.
С одной стороны, работать в личных репозиториях через пул-реквесты кажется избыточным. Куда проще коммитить в репозиторий напрямую.
С другой стороны, с помощью пул-реквестов можно группировать вносимые изменения, давать им заголовки и краткие описания. Получаем самодокументирующийся проект и некоторую организацию рабочего процесса. Порядок бьет класс, как говорится.
Подготовка репозитория
Перед тем как переходить к пул-реквестам, нам необходимо создать репозиторий с начальным исходным кодом. Пусть это будет проект на 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 через механизм пул-реквестов. Это хорошее начало перед более вдумчивым и обширным освоением инструмента, так как пул-реквесты (или где-то их называют мердж-реквесты) повсеместно используются в разработке ПО.
Видео-версия текста статьи:
Читайте больше в моем Телеграм канале: Так себе программист
Subscribe to my newsletter
Read articles from Alexander Trotsenko directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Alexander Trotsenko
Alexander Trotsenko
Software Developer