Pull request / Merge request

Материал из llmdocs — справочник разработчика
Портал: Git, CI/CD, DevOps
Pull request / Merge request
Названияpull request (GitHub, Bitbucket), merge request (GitLab)
ПоявлениеGitHub, 2008
Основа в Gitкоманда git request-pull (2005)
Участникиавтор, ревьюеры, владельцы кода (CODEOWNERS)
Способы слиянияmerge commit, squash, rebase
ПроверкиCI, обязательные ревью, отсутствие конфликтов

Pull request (PR, «запрос на вытягивание») или merge request (MR, «запрос на слияние») — предложение влить изменения из одной ветки Git в другую, оформленное на платформе разработки как отдельная страница: описание, список коммитов, построчный дифф, обсуждение, ревью и результаты автоматических проверок.[1] Название зависит от платформы: GitHub и Bitbucket говорят «pull request», GitLab — «merge request»; суть одна.[2] PR — основная единица командной работы с кодом: через него проходит почти каждое изменение основной ветки.

Откуда название

В самом Git есть команда git request-pull (2005): она формирует текстовое письмо с просьбой «вытянуть» (git pull) изменения из указанного репозитория — так до сих пор принимаются изменения в ядро Linux.[6] GitHub в 2008 году превратил это письмо в веб-страницу с обсуждением, а вместе с форками — в стандартный путь участия в открытых проектах. GitLab выбрал название, отражающее итоговое действие, — слияние.

Жизненный цикл

  1. Разработчик создаёт ветку от основной (или форк чужого репозитория), делает коммиты и отправляет ветку на сервер.
  2. Открывает PR: указывает целевую ветку, пишет описание — что и зачем изменено, как проверить, ссылки на задачу (Closes #123 закроет задачу при слиянии).
  3. Запускаются автоматические проверки CI/CD: сборка, тесты, линтеры, сканеры безопасности.
  4. Ревьюеры читают дифф, оставляют комментарии к строкам, предлагают правки (suggestions), одобряют или запрашивают изменения.
  5. Автор отвечает и дописывает коммиты; PR обновляется автоматически.
  6. Когда выполнены условия защиты ветки — нужные одобрения, зелёные проверки, нет конфликтов, — PR сливается и ветку удаляют.

Черновик (draft) PR открывают заранее, чтобы показать ход работы и прогнать CI, — слить его нельзя, пока автор не отметит готовность.

git switch -c fix/login-timeout
git commit -am "Увеличить таймаут входа до 30 секунд"
git push -u origin fix/login-timeout
gh pr create --fill --draft          # GitHub CLI
glab mr create --fill                # GitLab CLI

Способы слияния

Платформы предлагают три кнопки (доступные варианты настраиваются в репозитории):[3]

Способ Результат в основной ветке
Merge commit все коммиты ветки + коммит слияния; история полная
Squash and merge один коммит на весь PR; история основной ветки чистая
Rebase and merge коммиты ветки переносятся поверх, без коммита слияния; история линейная

Подробно о различиях — в статье Merge и rebase.

Код-ревью

Ревью — главная ценность PR: второй человек находит ошибки, следит за архитектурой и распространяет знание о коде в команде. Рекомендации из практики крупных компаний:[5]

  • маленькие PR — изменения на 100–300 строк ревьюят быстрее и внимательнее, чем на 2000;
  • один PR — одна задача, рефакторинг отдельно от новой функциональности;
  • описание отвечает на вопрос «зачем», а не пересказывает дифф;
  • комментарии — о коде, а не об авторе; мелочи помечают как необязательные (nit:);
  • стиль и форматирование проверяют автоматически (линтеры, форматтеры), а не люди.

Файл CODEOWNERS назначает ответственных за каталоги и файлы: при изменении infra/ в ревьюеры автоматически добавляется команда инфраструктуры, а правила защиты ветки могут требовать её одобрения.[4]

# .github/CODEOWNERS
*.py          @example/backend
/infra/       @example/platform
/docs/        @example/tech-writers

Шаблоны и автоматизация

Шаблон описания (.github/pull_request_template.md, в GitLab — .gitlab/merge_request_templates/) задаёт чек-лист: тесты, миграции, документация. Боты обновляют зависимости собственными PR (Dependabot, Renovate), а ИИ-ассистенты всё чаще выполняют первичное ревью и описывают изменения. Очередь слияния (merge queue) последовательно проверяет PR поверх свежей основной ветки, чтобы два по отдельности зелёных изменения не сломали её вместе.

Подходы

  • Короткоживущие ветки (GitHub Flow, trunk-based) — PR живёт часы или дни; чем дольше ветка, тем болезненнее конфликты.
  • Стековые PR (stacked PRs) — большая задача разбивается на цепочку зависимых PR, которые ревьюят по очереди.
  • Ревью после слияния — в небольших доверенных командах изменения вливают сразу, а смотрят позже; скорость в обмен на риск.

См. также

Источники

  1. GitHub Docs — About pull requests
  2. GitLab Docs — Merge requests
  3. GitHub Docs — About merge methods on GitHub
  4. GitHub Docs — About code owners
  5. Google Engineering Practices — Code Review Developer Guide
  6. git-request-pull documentation