Как работать с пул-реквестами в личном репозитории GitHub
Учимся работать с пул-реквестами на 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 через механизм пул-реквестов. Это хорошее начало перед более вдумчивым и обширным освоением инструмента, так как пул-реквесты (или где-то их называют мердж-реквесты) повсеместно используются в разработке ПО.
Видео-версия текста статьи:
Читайте больше в моем Телеграм канале: Так себе программист