Теорія
Що таке pull request: анатомія сторінки PR
Що таке pull request, згори донизу: базова гілка й гілка змін, чернетка і готовий PR, чотири вкладки, опис і шаблон pull request, рев'юери й мітки, пов'язані issues, перевірки й блок мерджу.
~9 хв читання · 11 вправ · 250 балів
Перед початком
Твоє рев'ю
Сьогодні зранку Daniel позначив своє виправлення кнопки, #134, як готове до рев'ю і попросив двох людей його переглянути: Oscar, бекенд-розробника, і тебе з продуктової команди Котокорму. Oscar перевірить код, а ти — чи робить виправлення те, про що просила підтримка.
Цей модуль — про pull requests. У першому уроці ти прочитаєш сторінку pull request згори донизу й дізнаєшся, що розповідає кожна її частина, перш ніж щось вирішувати.
Читай стрілку: база і гілка змін
Pull request це пропозиція: «візьміть коміти з моєї гілки й змерджте їх у ту». Його сторінка збирає все, що потрібно команді для рішення: опис, обговорення, коміти, автоматичні перевірки й diff. У GitLab те саме називають merge request (MR); відрізняється лише назва.

Найважливіший факт стоїть у рядку під назвою: «Daniel wants to merge 2 commits into main from fix/checkout-button». Гілка після into це база (base): сюди потраплять коміти. Гілка після from це гілка змін (compare): звідти коміти приходять. GitHub малює це ще й так: main ← fix/checkout-button.
- Open
Fix checkout button after cart edits#134
Daniel wants to merge 2 commits into main from fix/checkout-button: Daniel пропонує влити 2 коміти з fix/checkout-button у main
База не завжди main. Pull request може йти в іншу гілку фічі або в develop, якщо команда спершу збирає роботу там. Його мердж змінює лише цю базову гілку; main і живий сайт лишаються як були, доки наступний мердж не понесе роботу далі. Коли pull request відкривають із термінала, ту саму базу задає gh pr create --base main.

- Так«#134 іде в
main, тож після мерджу він потрапить на сайт із наступним деплоєм».Спершу читає базу, потім робить висновки.
- Не так«Змерджено, отже, на сайті!» про pull request у
feature/gift-wrap.Змінилася лише базова гілка,
mainні.
Чернетка чи готовий до рев'ю
Чернетка pull request (draft) каже: «робота триває, рев'ю поки не треба». Її бейдж сірий і має напис Draft. Чернетку GitHub не змерджить, хай що кажуть рев'ю: там, де мала б бути кнопка мерджу, стоїть кнопка Ready for review.
Навіщо відкривати pull request, поки робота не завершена? Команда бачить, що наближається, автоматичні перевірки вже запускаються на кожному новому коміті, і ніхто не витрачає рев'ю на пів виправлення. Daniel відкриває чернетки рано навмисно.
Коли автор натискає Ready for review, бейдж стає зеленим (Open), а рев'юери отримують сповіщення. Це працює й у зворотний бік: Convert to draft у бічній панелі повертає відкритий pull request у чернетку, наприклад коли автор знаходить проблему посеред рев'ю. У терміналі це gh pr create --draft, gh pr ready 136 і gh pr ready 136 --undo.
І чернетка, і відкритий PR ще не змерджені. Бейдж каже лише, чи автор уже чекає на рев'ю.
- ТакВідкрити #136 чернеткою в перший же день, щоб запускалися перевірки й команда бачила, як з'являється банер.
Робота видна рано, а рев'ю не передчасне.
- Не такСхвалити чернетку й сказати маркетингу, що її можна змерджити сьогодні.
Чернетку не змерджиш, доки автор не позначить її готовою.
Чотири вкладки, чотири питання
Під шапкою pull request є чотири вкладки (станом на 2026 рік), кожна з лічильником. Обирай вкладку за питанням, яке ставиш.
Conversation: стрічка подій. Спершу опис, далі коментарі, рев'ю, нові коміти й зміни стану в порядку часу. Унизу стоїть блок мерджу.Commits: власні коміти гілки, крок за кроком. Лише коміти з гілки змін, а не ті, що тим часом з'явилися вmain. У терміналі той самий набір показуєgit log --oneline main..fix/checkout-button.Checks: автоматичні запуски, як-отbuild,testіpreview, з логами.Files changed: diff усього pull request. Кожен змінений файл, видалені рядки червоні, додані зелені, з підрахунком для кожного файлу. Той самий підсумок друкуєgit diff --stat main...fix/checkout-button.
f02a6d4Update FAQ answers3a9d1c4Reproduce bug in a test8be2f70Add cat treats bundleb7e4a05Re-enable button after cart editsfix/checkout-button6f2c8a1Raise free-delivery threshold to 1000 UAH (#133)a7d93e4Rewrite delivery page copy (#132)main
Граф комітів, від найстарішого: Що охоплює вкладка Commits у #134 1. коміт f02a6d4 у main "Update FAQ answers" 2. гілка fix/checkout-button починається від коміту f02a6d4 3. коміт 3a9d1c4 у fix/checkout-button "Reproduce bug in a test" (виділено) 4. коміт 8be2f70 у main "Add cat treats bundle" 5. коміт b7e4a05 у fix/checkout-button "Re-enable button after cart edits" (виділено) 6. коміт 6f2c8a1 у main "Raise free-delivery threshold to 1000 UAH (#133)" 7. коміт a7d93e4 у main "Rewrite delivery page copy (#132)"
Перелік файлів це ще й перша перевірка меж зміни. У #134 виправлення кнопки зачепило ще й styles/checkout.css: про такий файл варто спитати.
- Так«Чи пройшли тести?» → відкрити
Checksі прочитати лог запуску, що впав.Одне питання, одна вкладка.
- Не такШукати у
Files changed, навіщо взагалі зробили зміну.Відповідь «навіщо» живе в описі на
Conversation.
Що містить опис pull request
Опис це перший коментар на Conversation, і для рев'юера це найкорисніший текст на сторінці. Добрий опис читається як маленький бриф із чотирьох частин:
- What: зміна простими словами.
- Why: проблема з посиланням на її issue (
Fixes #131). - How to test: кроки, які може повторити будь-хто, починаючи з посилання на preview.
- Screenshots: як було і як стало, для всього, що бачать клієнти.

Багато команд додають п'яту частину: що зміна свідомо не охоплює, щоб ніхто не шукав у ній того, чого вона не обіцяла.
Чого там не треба: переліку всіх змінених файлів (він уже є у Files changed) і прохань на кшталт «pls review asap», які нічого не кажуть про саму зміну. Слабкий опис коштує автору зустрічі: троє рев'юерів ставлять ті самі три питання, або pull request ніхто не відкриває взагалі.
Для PM опис ще й мірило меж: усе в diff, про що опис мовчить, варте питання.
- Так«Why: Fixes #131. Після редагування кошика клієнти бачили сіру кнопку й не могли оформити замовлення».
Проблема з посиланням на issue.
- Так«How to test: 1. Відкрий preview. 2. Зміни кількість: кнопка лишається зеленою».
Кроки, які повторить будь-хто.
- Не так«fixed checkout, pls review»
Ні проблеми, ні кроків перевірки, ні меж.
Назва і шаблон pull request
Перш ніж хтось прочитає опис, він бачить назву в списку з п'ятдесяти pull requests. Добра назва каже, що змінюється і де: «Fix checkout button after cart edits». «Checkout fixes» чи «Daniel's branch» не кажуть нічого, а згодом та сама назва з'явиться в нотатках до релізу та в історії main, тож вона окупається двічі.
Щоб опис не починався з порожнього поля, команди тримають шаблон pull request: Markdown-файл у репозиторії, зазвичай .github/pull_request_template.md. Коли хтось відкриває новий pull request, GitHub копіює шаблон в опис, і кожен PR починається з тих самих заголовків: What, Why, How to test, Screenshots.
Рядки всередині <!-- --> це підказки для автора; у готовому описі GitHub їх не показує. Заповнити шаблон можна за дві хвилини, а порожні заголовки нагадують, про що спитають рев'юери. У GitLab та сама ідея називається шаблонами merge request.
- ТакНазва: «Fix checkout button after cart edits»
Що змінюється і де, зрозуміло в будь-якому списку.
- Не такНазва: «Checkout fixes», опис порожній
Зі списку ніхто не зрозуміє, що переглядати.
Ключові слова закриття: Fixes #131
Fixes #131 в описі це більше, ніж посилання. Fixes це ключове слово закриття (closing keyword): коли pull request змерджать в основну гілку репозиторію (у Котокорму це main), GitHub сам закриє issue #131.
Працюють три дієслова в будь-якій формі: close, fix і resolve. Тож Closes #131, Fixed #131 і Resolves #131 теж спрацюють. Кожне issue потребує власного ключового слова: Fixes #131, fixes #132. Без ключового слова «#131» це лише згадка: сторінки посилаються одна на одну, і нічого не закривається.
Бічна панель підтверджує зв'язок у розділі Development: «Successfully merging this pull request may close these issues» і далі #131 (так GitHub формулює станом на 2026 рік).
Важливий момент. Відкриття pull request, схвалення чи вихід із чернетки лише пов'язують дві сторінки; issue лишається відкритим до мерджу. І ключове слово діє лише на мердж в основну гілку. Котокорм викладає кожен мердж у main за кілька хвилин, тож підтримка бачить закриття #131 приблизно тоді, коли виправлення з'являється на сайті.
- Так
Fixes #131, fixes #132По ключовому слову на кожне issue: обидва закриються.
- Не так
Related to #131і чекати, що issue закриєтьсяБез ключового слова закриття це лише згадка.
Ключове слово діє лише в основній гілці
Ключові слова закриття мають одну умову, яку легко проґавити: вони діють лише тоді, коли pull request змерджено в основну гілку. Це гілка, з якої відкривається репозиторій, зазвичай main.
Деякі pull requests ідуть деінде. Зміна текстів може бути спрямована в feature/gift-wrap, гілку, де будують більшу фічу, а команди з гілкою develop зливають туди більшість pull requests. Змерджиш такий pull request, і його Closes #140 нічого не зробить: issue лишиться відкритим, бо робота ще не дійшла до основної гілки.
І це правильна поведінка. Issue має закриватися, коли виправлення справді в main, а не коли воно на крок ближче.
Тож якщо база не основна гілка, вирішіть, як закриється issue. Додайте ключове слово в pull request, який зрештою понесе роботу в main, або закрийте issue вручну, коли той мердж станеться. Перш ніж звітувати, що щось готове, прочитай базу в шапці, а тоді подивися на стан issue.
- ТакДодати
Closes #140у pull request, який зливаєfeature/gift-wrapуmain.Issue закриється, коли робота дійде до
main. - Не такЗмерджити pull request у
feature/gift-wrapі сказати підтримці, що #140 готове.Issue досі відкрите, і на сайті нічого немає.
Бічна панель: хто що робить
Бічна панель праворуч відповідає на питання «хто і для чого»:
Reviewers: люди, яких попросили про вердикт. На #134 це Oscar для коду і Sofia для продуктового боку.Assignees: хто відповідає за те, щоб pull request дійшов до кінця, зазвичай автор. Призначення нічого не схвалює.Labels: кольорові мітки для сортування й фільтрів, як-отbugіcheckout. Вони не змінюють код і нічого не блокують.ProjectsіMilestone: місце роботи в планах команди.Development: пов'язане issue, яке закриє ключове слово.
Розрізняй два види правил. Правило забезпечує GitHub: у Котокорму main вимагає одного схвалення, і доти кнопка мерджу просто заблокована. Звичку забезпечує команда: Котокорм просить двох рев'юерів, інженера для коду й продуктову людину для всього, що побачать клієнти. GitHub прийняв би й одного.
У терміналі ті самі поля задає gh pr edit 134 --add-reviewer oscar --add-label bug.
- Так«Oscar переглядає код, я переглядаю те, що побачать клієнти».
Двоє рев'юерів, два різні питання.
- Не так«Daniel виконавець, отже, схвалено».
Виконавець відповідає за роботу, а не схвалює її.
Перевірки, preview і блок мерджу
Щоразу, коли автор надсилає коміт, на ньому автоматично запускаються перевірки (checks). У Котокорму їх три: build (чи сайт досі збирається?), test (чи проходять автоматичні тести?) і preview. Перші дві це безперервна інтеграція (CI): роботи, які перевіряють кожну зміну. preview викладає гілку на тимчасову копію сайту з власним посиланням, тож PM може поклацати зміну на телефоні раніше, ніж її побачить будь-який клієнт.

Перевірки запускаються на гілці, на її найновішому коміті, а не на живому сайті. Сайт і далі показує main. Тому червоний test означає «ця зміна зламала тест, її треба переглянути», а не «клієнти не можуть оформити замовлення». Падіння на старішому коміті перестає мати значення, щойно новіший проходить. У терміналі той самий список друкує gh pr checks 134.
build
Successful in 1m: успішно за хвилину
test
Successful in 3m: успішно за три хвилини
preview
Preview deployed: попередню версію викладено, посилання View deployment
Унизу Conversation блок мерджу підсумовує, чи можна зливати pull request: рев'ю, перевірки й конфлікти. «Review required» разом із «Merging is blocked» (так GitHub пише станом на 2026 рік) означає, що перевірки можуть бути зелені, але схвалення ще немає.
- Так«На найновішому коміті #134 впав
test. Daniel уже розбирається; живий сайт це не зачіпає».Каже, де падіння і що воно означає.
- Не так«Оформлення зламане, скажіть клієнтам почекати!»
Перевірки тестують гілку, а не живий сайт.
Готові потренуватися?
Виконайте вправи уроку й отримайте 250 балів, коли пройдете його вперше.
Розпочати вправи