Перейти до змісту
Увійти

Теорія

Що таке 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); відрізняється лише назва.

Сторінка pull request: шапка з напрямком мерджу, чотири вкладки, опис, блок мерджу внизу і бічна панель із рев'юерами, мітками та пов'язаним issue.

Найважливіший факт стоїть у рядку під назвою: «Daniel wants to merge 2 commits into main from fix/checkout-button». Гілка після into це база (base): сюди потраплять коміти. Гілка після from це гілка змін (compare): звідти коміти приходять. GitHub малює це ще й так: main ← fix/checkout-button.

Шапка pull request #134
  • 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.
Що охоплює вкладка Commits у #134Pull request містить лише два коміти з fix/checkout-button. Тим часом main пішла вперед на три коміти; що це означає для мерджу, покаже урок 3.
  1. f02a6d4Update FAQ answers
  2. 3a9d1c4Reproduce bug in a test
  3. 8be2f70Add cat treats bundle
  4. b7e4a05Re-enable button after cart editsfix/checkout-button
  5. 6f2c8a1Raise free-delivery threshold to 1000 UAH (#133)
  6. 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.

Перевірки на останньому коміті #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 балів, коли пройдете його вперше.

Розпочати вправи