Pull Request
Запрос на включение изменений — основной инструмент code review и совместной разработки
Описание
Pull Request (PR) — это запрос от разработчика к владельцу репозитория принять его изменения (merge ветку). PR — не команда Git, а функция платформы (GitHub, GitLab, Bitbucket). На GitLab этот механизм называется Merge Request (MR), но суть та же.
PR решает сразу несколько задач: предоставляет единое место для обсуждения изменений, запускает автоматические проверки (CI/CD, линтеры, тесты), организует code review (рецензирование кода), документирует историю принятых решений. Даже в командах из одного человека PR-workflow полезен: он добавляет паузу перед слиянием, позволяя перечитать изменения «свежим взглядом».
Хороший PR: маленький и сфокусированный (одна задача), с понятным описанием (что изменилось и зачем), с тестами, покрывающими изменения, без конфликтов с target-веткой. Мейнтейнеры больших проектов читают десятки PR в неделю — качественное описание и чистая история коммитов значительно ускоряют рассмотрение.
Жизненный цикл Pull Request
Создание ветки и работа
Разработчик создаёт feature-ветку от актуального main, вносит изменения, коммитит.
Push ветки на remote
git push -u origin feature/my-feature — GitHub покажет кнопку «Compare & pull request».
Открытие PR
Заполнить название, описание, назначить reviewers, labels, milestone. Привязать к issue через «Fixes #123».
Автоматические проверки (CI)
GitHub Actions / другой CI запускает тесты, линтеры, проверку типов. Статус отображается прямо в PR.
Code Review
Reviewers оставляют комментарии, запрашивают изменения (Request changes) или одобряют (Approve). Автор вносит правки и пушит новые коммиты — PR обновляется автоматически.
Merge
После одобрения и прохождения CI мейнтейнер сливает PR. Ветку можно удалить сразу после merge (GitHub предложит).
Стратегии слияния PR
GitHub предлагает три способа слить PR. Выбор зависит от политики команды.
| Концепция | Пояснение |
|---|---|
base branch |
Ветка-цель, в которую будут влиты изменения. Обычно main или develop. |
compare branch |
Ваша feature-ветка с изменениями. |
Draft PR |
Черновой PR — запускает CI, но сигнализирует, что работа не закончена. Reviewers не получают уведомления. Конвертируется в обычный PR нажатием кнопки. |
Fixes #<issue> |
Магическая фраза в описании PR. После merge автоматически закроет связанный issue. Работают также: Closes, Resolves. |
CODEOWNERS |
Файл в репозитории, задающий автоматических reviewers для разных частей кодовой базы. Если изменён файл из зоны ответственности — reviewer назначается автоматически. |
Protected branch |
Ветка с ограничениями: нельзя пушить напрямую, нужно минимальное количество approvals, CI должен пройти. Настраивается в Settings → Branches на GitHub. |
Review: Approve |
Reviewer одобрил изменения. PR можно сливать (если число approvals достигнуто). |
Review: Request changes |
Reviewer требует доработки. PR нельзя слить, пока автор не внесёт изменения и reviewer не одобрит снова. |
gh pr create |
Создать PR из командной строки через GitHub CLI. Удобно в автоматизации. Пример: gh pr create --title "feat: dark mode" --body "..." |
gh pr checkout |
Переключиться на ветку чужого PR локально: gh pr checkout 42. Удобно для review и тестирования. |
Паттерны использования
Создать PR через GitHub CLI
# Установить GitHub CLI: https://cli.github.com # Авторизоваться gh auth login # Создать PR из текущей ветки gh pr create \ --title "feat: add dark mode" \ --body "## Changes\n- Added toggle\n\nFixes #42" \ --label "enhancement"
Посмотреть и проверить чужой PR
# Список открытых PR gh pr list # Переключиться на ветку PR #42 gh pr checkout 42 # Запустить тесты локально npm test # Оставить комментарий gh pr review 42 --comment -b "LGTM, but check edge case"
Обновить PR после review
# Внести правки после Request changes git add fixed-file.py git commit -m "fix: handle edge case in dark mode" # Push — PR обновится автоматически git push origin feature/dark-mode # Попросить повторный review gh pr review 42 --request-review @reviewer
Draft PR для ранней обратной связи
# Создать черновой PR gh pr create --draft \ --title "WIP: refactor auth module" \ --body "Early feedback welcome on the API design" # Конвертировать в обычный PR gh pr ready
Шаблон описания PR
# Создать файл .github/PULL_REQUEST_TEMPLATE.md: ## Что изменилось - ## Зачем Closes # ## Как проверить 1. 2. ## Чеклист - [ ] Тесты написаны/обновлены - [ ] Документация обновлена
Слить и удалить ветку локально
# После merge PR на GitHub git checkout main git pull origin main # Удалить локальную ветку git branch -d feature/dark-mode # Удалить remote-ветку (если не удалил GitHub) git push origin --delete feature/dark-mode # Или одной командой через gh gh pr merge 42 --squash --delete-branch
Советы и подводные камни
git rebase main (чистая история, но меняет хеши коммитов) или git merge main (сохраняет хеши, но добавляет merge-коммит). После разрешения конфликтов — git push --force-with-lease.
.gitignore с первого дня проекта и инструменты вроде git-secrets или gitleaks.