Открыть сервис

Pул-реквест

Pull request (пул-реквест, PR) — это механизм в системах управления версиями (прежде всего в Git), предназначенный для уведомления участников проекта о внесённых изменениях в код, их обсуждения и последующего слияния (merge) с целевой веткой (обычно основной). Пул-реквест является ключевым элементом распределённой разработки, позволяя организовать рецензирование (code review) и автоматизированную проверку кода перед его интеграцией в основную кодовую базу.

История и происхождение

Термин «pull request» был введён компанией GitHub, которая запустила этот функционал в 2008 году. Идея заключалась в том, чтобы разработчик, создавший форк (копию) репозитория, мог запросить (request) у владельца оригинального репозитория «забрать» (pull) его изменения. До этого в распределённых системах, таких как Git, обмен патчами происходил через электронную почту (например, в проекте Linux) или через специализированные утилиты.

Позднее аналогичный функционал появился в других платформах: Bitbucket (Atlassian), GitLab, а также в децентрализованных системах, таких как Gitea и SourceHut. В GitLab аналогичный процесс называется «Merge Request» (MR), что технически точнее, так как изменения не просто «забираются», а сливаются с целевой веткой. Однако термин «pull request» стал общеупотребительным.

Устройство и процесс работы

Пул-реквест объединяет в себе несколько этапов разработки:

1. Создание ветки и внесение изменений

Разработчик создаёт новую ветку (feature branch) от целевой (например, main или master), вносит изменения, коммитит их и отправляет (push) в удалённый репозиторий (часто в свой форк или в отдельную ветку основного репозитория).

2. Открытие пул-реквеста

На платформе (GitHub, GitLab и т.д.) разработчик создаёт PR, указывая:

  • Исходную ветку (source) — свою ветку с изменениями.
  • Целевую ветку (target) — ветку, в которую планируется слияние.
  • Заголовок и описание — краткое описание изменений, их цель, возможно, ссылки на задачи (issue) или требования.

3. Обсуждение и рецензирование (Code Review)

После открытия PR другие участники проекта (коллеги, мейнтейнеры) могут:

  • Просматривать изменения (diff) построчно.
  • Оставлять комментарии (общие или к конкретным строкам кода).
  • Запрашивать изменения (request changes) или одобрять (approve).
  • Разработчик может вносить дополнительные коммиты в ту же ветку, которые автоматически добавляются в PR.

4. Автоматические проверки (CI/CD)

Современные платформы интегрируются с системами непрерывной интеграции (CI). При открытии или обновлении PR автоматически запускаются:

  • Сборка проекта.
  • Юнит-тесты.
  • Статический анализ кода (линтеры, проверки стиля).
  • Проверки безопасности.
  • Покрытие кода тестами.

Результаты отображаются прямо в интерфейсе PR. Если проверки не пройдены, слияние обычно блокируется.

5. Слияние (Merge)

После того как PR прошёл все проверки и получил одобрение (количество требуемых одобрений настраивается), ответственный участник (или сам автор, если есть права) выполняет слияние. Существуют несколько стратегий слияния:

  • Merge commit — создаётся отдельный коммит слияния, сохраняющий историю веток.
  • Squash and merge — все коммиты из ветки PR «схлопываются» в один коммит, который добавляется в целевую ветку. Упрощает историю, но теряет детализацию.
  • Rebase and merge — коммиты PR пересоздаются поверх последнего коммита целевой ветки (без коммита слияния). История становится линейной.

6. Закрытие

После успешного слияния PR автоматически закрывается. Ветка, из которой делался PR, может быть удалена (как вручную, так и автоматически).

Виды и варианты использования

Внутренние PR (в основном репозитории)

Используются в командах, где все разработчики имеют доступ к одному репозиторию. Каждый создаёт отдельную ветку и открывает PR в основную ветку.

PR из форков (Fork-based PR)

Типичны для open-source проектов. Разработчик, не имеющий прав на запись в основной репозиторий, создаёт его форк (копию), вносит изменения в своём форке и открывает PR в оригинальный репозиторий. Мейнтейнеры проекта просматривают и принимают или отклоняют изменения.

PR для документации и конфигурации

Пул-реквесты применяются не только для кода, но и для изменений в документации (например, в вики-проектах), конфигурационных файлах (например, в Kubernetes-манифестах) или даже в текстовых файлах (например, в проектах по переводу).

Преимущества и критика

Преимущества

  • Контроль качества: обязательное рецензирование снижает вероятность внесения ошибок и несоответствий стандартам.
  • Аудит изменений: вся история обсуждений и решений сохраняется в интерфейсе PR.
  • Автоматизация: интеграция с CI/CD позволяет автоматически проверять изменения перед слиянием.
  • Параллельная работа: несколько разработчиков могут одновременно работать над разными функциями, не мешая друг другу.
  • Прозрачность: все участники проекта видят, какие изменения предлагаются и почему.

Критика и недостатки

  • Задержки: ожидание рецензии может замедлять разработку, особенно в небольших командах или при отсутствии чётких правил.
  • Блокировка: если PR долго не рецензируется, работа может встать.
  • Сложность для небольших правок: для исправления одной опечатки или мелкого бага открытие полноценного PR может быть избыточным.
  • Злоупотребление «спагетти-кодом»: при большом количестве изменений в одном PR рецензирование становится затруднительным.
  • Культурные аспекты: в некоторых командах PR воспринимается как формальность, а не как инструмент для обсуждения, что снижает его эффективность.

Альтернативы и эволюция

В некоторых проектах и платформах используются альтернативные подходы:

  • Патчи по электронной почте (Linux, Git-проекты) — классический метод, до сих пор применяемый в ядре Linux.
  • Push-регламенты (в некоторых корпоративных системах) — разработчики могут напрямую пушить в основную ветку, но с обязательным последующим рецензированием.
  • Trunk-based development (разработка на основе ствола) — предполагает частые, небольшие коммиты напрямую в основную ветку, с использованием короткоживущих веток и PR только для сложных изменений.

Современные платформы (GitHub, GitLab, Bitbucket) постоянно развивают функционал PR: добавляют шаблоны, автоматические назначения рецензентов, проверки на конфликты, интеграцию с системами управления задачами (Jira, Trello, Linear) и визуализацию зависимостей между PR.

Интересные факты

  • Первый пул-реквест на GitHub был открыт 1 февраля 2008 года разработчиком Томом Престон-Вернером (Tom Preston-Werner), одним из сооснователей GitHub.
  • В GitLab термин «Merge Request» используется с самого основания платформы, и компания подчёркивает, что это более точное название, так как изменения не «забираются», а «сливаются».
  • В крупных проектах (например, Kubernetes, TensorFlow) количество открытых PR может достигать сотен и тысяч, а время ожидания рецензии может составлять от нескольких часов до нескольких недель.
  • Некоторые компании внедряют «PR-политики»: например, обязательное наличие двух одобрений, запрет на слияние собственных PR, обязательное прохождение всех CI-проверок.

Источники

  • Chacon, S., Straub, B. «Pro Git» (2nd Edition). Apress, 2014.
  • Документация GitHub: «About pull requests».
  • Документация GitLab: «Merge requests».
  • Документация Bitbucket: «Pull requests».
  • Статья «The History of Pull Requests» на сайте GitHub Blog (2008).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →