title | seoTitle | seoDescription | datePublished | cuid | slug | cover | tags |
---|---|---|---|---|---|---|---|
Как работать с пул-реквестами в личном репозитории GitHub |
Как работать с пул-реквестами в личном репозитории GitHub |
Учимся работать с пул-реквестами на GitHub в личных репозиториях |
Mon Nov 25 2024 19:53:41 GMT+0000 (Coordinated Universal Time) |
cm3xg4f8q000109l19vcb8ks5 |
kak-rabotat-s-pul-rekvestami-v-lichnom-repozitorii-github |
github, version-control, git, pull-requests, qt-creator, git-workflow, pul-rekvest |
Обычно в инструкциях по пул-реквестам (pull request) GitHub рассматривают примеры на базе форков (fork). Мы же попрактикуем работу с пул-реквестом исключительно в пределах личного репозитория.
С одной стороны, работать в личных репозиториях через пул-реквесты кажется избыточным. Куда проще коммитить в репозиторий напрямую.
С другой стороны, с помощью пул-реквестов можно группировать вносимые изменения, давать им заголовки и краткие описания. Получаем самодокументирующийся проект и некоторую организацию рабочего процесса. Порядок бьет класс, как говорится.
Перед тем как переходить к пул-реквестам, нам необходимо создать репозиторий с начальным исходным кодом. Пусть это будет проект на C++ и CMake. Я, например, создал самый обычный “Hello World” в среде разработки QtCreator.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732461586872/f51bfbbc-6e46-4cd8-94e3-40aac6c1bab9.jpeg align="center")
Теперь загрузим проект на GitHub. Для этого создадим новый личный репозиторий на GitHub и закоммитим туда наш код.
Идем на GitHub и создаем репозиторий.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732462204016/bf037fa8-2fdd-427a-8b07-9fc1d506a14e.png align="center")
На странице создания репозитория вводим его название (у меня это “pr_example”) и жмем “Create repository”.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732462370246/e11e1f4c-de88-406e-8b35-6aa61d42b04a.png align="center")
Пустой репозиторий создан. Теперь, используя подсказки по командам git, загружаем свой проект на GitHub. Эти команды должны быть выполнены в терминале на вашем компьютере в папке проекта. Для удобства я использовал терминал прямо в среде QtCreator.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732462676128/e012a0b0-3636-4ef1-9612-26f5133f4a56.png align="center")
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732463113388/8b3857bc-540c-4fbe-9407-517be3fa78d6.png align="center")
Рассмотрим команды по порядку. Инициализируем локальный репозиторий в папке проекта:
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
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732463709348/28060b0e-7165-402c-99f7-e68f2ea4d62a.png align="center")
Теперь, обновив страницу вашего репозитория на GitHub, вы увидите загруженные файлы. На этом подготовка репозитория завершена, переходим к работе с пул-реквестами.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732463840243/b981f64b-9a13-43c9-8d6e-f2bd998966d7.png align="center")
Работа с пул-реквестами неразрывно связана с ветками git. Общая идея такая:
-
коммиты не должны выполняться напрямую в ветку main,
-
для работы создается отдельная ветка и коммиты выполняются только в нее.
Итак, переходим в терминал, создаем новую ветку с названием new_feature и переключаемся на нее:
git switch -c new_feature
С помощью команды git branch
можно увидеть, что теперь у нас в проекте две ветки.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732464578866/51e5d341-f281-4d62-89b4-2937ff6e60eb.png align="center")
Теперь внесем изменения в код main.cpp, добавив дополнительные восклицательные знаки к строке “Hello World!!!”. С помощью команды git status
можем увидеть, что файл main.cpp перешел в статус измененных.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732464907476/d79f88af-c64d-4ede-abd9-692f746be505.png align="center")
Закоммитим изменения, предварительно добавив файл в индекс коммита.
Файлы, не добавленные в индекс коммита, не могут быть закоммичены. Я пользуюсь этой фишкой, например, когда фиксирую обширные изменения в нескольких файлах. Файлы можно добавлять в индекс и коммитить по очереди.
git add main.cpp # Добавление файла в индекс коммита
git commit -m "second commit"
Коммит в отдельной ветке готов. Отправляем нашу ветку new_feature в удаленный репозиторий на GitHub и можем переходить к пул-реквесту:
git push --set-upstream origin new_feature
Другие способы загрузки кода на GitHub рассмотрены в статье Как загрузить код проекта на GitHub
Как только новая ветка загружен на GitHub, ресурс нам сразу же предлагает создать пул-реквест. Воспользуемся предложением.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732465666003/e3d53920-8bff-4898-aa56-4a5539ab954b.png align="center")
Создание пул-реквеста требует указания только его названия, которое заполняется автоматически из названия коммита. Остальные параметры можно не заполнять. Хотя я рекомендую проконтролировать, что текущая (compare) и целевая (base) ветки соответствуют ожиданиям, а также опционально можно коротко описать вносимые правки. Для личного репозитория этого достаточно.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732465935572/cff7708f-7adb-4719-bb3c-e73262b6b279.png align="center")
Пул-реквест создан и находится в состоянии Open. На этом этапе обычно выполняются контролирующие проверки вносимых правок: как автоматические, так и со стороны специалистов. В нашем же случае мы сразу переходим к слиянию пул-реквеста и нажимаем “Merge pull request”.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732466249533/21022e9a-8856-4654-aa4e-2a626e7f7fe2.png align="center")
Готово, пул-реквест завершен, а наша ветка new_feature слита в ветку main. Теперь ветка new_feature может быть безопасно удалена. Она больше не нужна, ее жизненный цикл окончен.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732466672828/8ab91970-f920-4c14-a127-c048197b8aed.png align="center")
Возвращаемся обратно в терминал и переключаемся на ветку main. Можно заметить, что на ветке main все еще старый код. Чтобы обновить ветку, нам нужно синхронизировать ее с веткой на GitHub командой pull:
git switch main
git pull
Теперь остается удалить ветку new_feature, которая осталась в локальном репозитории:
git branch -d new_featureя
На этом работа с пул-реквестом завершена.
В статье мы попробовали внести изменения в основную ветку проекта main через механизм пул-реквестов. Это хорошее начало перед более вдумчивым и обширным освоением инструмента, так как пул-реквесты (или где-то их называют мердж-реквесты) повсеместно используются в разработке ПО.
Видео-версия текста статьи:
%[https://youtu.be/WJtAhmc6gA4]
Читайте больше в моем Телеграм канале: Так себе программист