iOS Mobile Инженер

iOS Mobile Инженер

Роадмап навыков для прокачки

Работа с Pull Request / Merge Request

Software Development ProcessesСистема контроля версий (Git)Основное

Основная идея

Pull Request (PR) / Merge Request (MR) — это механизм для предложения изменений в кодовую базу с возможностью обсуждения, ревью и автоматических проверок перед слиянием. Это стандартный способ внесения изменений в командной разработке.

Ключевые этапы PR

  • Создание ветки — изоляция изменений от основной ветки
  • Коммиты — фиксация изменений с понятными сообщениями
  • Push — отправка ветки на сервер
  • Открытие PR — создание запроса на слияние с описанием
  • Code Review — проверка кода коллегами
  • CI/CD проверки — автоматические тесты и линтеры
  • Merge — слияние в целевую ветку

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

  • Обнаружение ошибок до попадания в production
  • Распространение знаний в команде
  • Повышение качества кода
  • Обучение через обратную связь

Терминология

  • PR (Pull Request) — термин GitHub
  • MR (Merge Request) — термин GitLab
  • Reviewer — проверяющий код
  • Approver — одобряющий изменения
  • Draft PR — черновик, не готовый к ревью

Частые ошибки на собеседованиях

  • Путают PR и merge — PR это запрос на merge, а не сам merge
  • Не знают разницу между PR и MR — функционально идентичны, разные названия
  • Забывают про CI/CD проверки в PR
  • Не упоминают squash merge и его преимущества
  • Не понимают роль Draft PR для работы в процессе

Введение и проблематика

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

Pull Request (GitHub) / Merge Request (GitLab) — это механизм для обсуждения и проверки изменений перед их интеграцией в основную ветку. Функционально идентичны, отличается только название.

Зачем нужен PR?

  • Code Review — проверка кода другими разработчиками
  • Автоматические проверки — CI/CD запускает тесты и линтеры
  • Документирование изменений — понятно что, зачем и как менялось
  • Контроль качества — код попадает в main только после одобрения
  • Коллаборация — обсуждение подхода в комментариях

Базовая теория

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

stateDiagram-v2 [*] --> Draft: Создание черновика Draft --> Open: Ready for review Open --> Review: Назначены ревьюеры Review --> ChangesRequested: Требуются правки ChangesRequested --> Review: Правки внесены Review --> Approved: Код одобрен Approved --> Merged: Слияние Open --> Closed: Отклонён/закрыт Merged --> [*] Closed --> [*]

Типы слияния PR

ТипОписаниеКогда использовать
Merge commitСоздаёт merge-коммитПо умолчанию, сохраняет историю
Squash and mergeВсе коммиты PR в одинЧистая история main
Rebase and mergeПеренос коммитов без merge-коммитаЛинейная история

Практические примеры

Полный цикл работы с PR

Шаг 1: Создание ветки

bash
# Убедиться, что main актуален
git checkout main
git pull origin main
 
# Создать feature-ветку
git checkout -b feature/user-authentication

Шаг 2: Разработка и коммиты

bash
# Внести изменения
git add .
git commit -m "feat(auth): add login form component"
 
git add .
git commit -m "feat(auth): implement JWT token handling"
 
git add .
git commit -m "test(auth): add unit tests for auth service"

Шаг 3: Отправка на сервер

bash
# Push ветки с установкой upstream
git push -u origin feature/user-authentication

Шаг 4: Создание PR

bash
# Через GitHub CLI
gh pr create --title "Add user authentication" \
  --body "## Summary
- Add login/logout functionality
- Implement JWT token handling
- Add unit tests
 
## Testing
- [x] Unit tests pass
- [x] Manual testing completed"

Или через веб-интерфейс GitHub/GitLab.

Шаг 5: Code Review и правки

bash
# После комментариев ревьюера, внести правки
git add .
git commit -m "fix(auth): address review comments"
git push

Шаг 6: Merge

После одобрения — нажать кнопку Merge в интерфейсе.

Шаг 7: Очистка

bash
git checkout main
git pull origin main
git branch -d feature/user-authentication

Структура хорошего PR

markdown
## Summary
Краткое описание что делает этот PR.
 
## Changes
- Добавлен компонент LoginForm
- Реализован сервис AuthService с JWT
- Добавлены unit-тесты
 
## Screenshots (если применимо)
[Скриншот интерфейса]
 
## Testing
- [ ] Unit тесты проходят
- [ ] E2E тесты проходят
- [ ] Ручное тестирование
 
## Related Issues
Closes #123
⚠️

Маленькие PR проще ревьюить! Старайтесь делать PR на 200-400 строк кода. Большие PR часто получают поверхностный ревью.


Code Review

Роли в процессе

РольОтветственность
AuthorСоздатель PR, отвечает на комментарии, вносит правки
ReviewerПроверяет код, оставляет комментарии
ApproverИмеет право одобрить PR для слияния
MaintainerФинальное решение о merge

Что проверять при Code Review

  • Читаемость и понятность
  • Соответствие code style
  • Отсутствие дублирования
  • Понятные имена переменных и функций
  • Нет закомментированного кода
  • Нет console.log и отладочного кода

Типы комментариев

markdown
# Блокирующий (требует исправления)
🔴 **Blocking:** Здесь SQL-инъекция, нужно использовать параметризованный запрос
 
# Предложение (желательно исправить)
🟡 **Suggestion:** Можно упростить этот цикл с помощью .map()
 
# Вопрос
**Question:** Почему выбран именно этот подход?
 
# Комплимент
**Nice:** Отличное решение с кешированием!
 
# Нит (мелочь)
📝 **Nit:** Лишний пробел в строке 42

CI/CD в Pull Request

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

Типичные проверки

yaml
# .github/workflows/pr-checks.yml
name: PR Checks
on: [pull_request]
 
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run lint
 
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test
 
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run build

Status Checks

СтатусЗначение
✅ PassingВсе проверки пройдены
❌ FailingЕсть ошибки, merge заблокирован
🟡 PendingПроверки выполняются
⏭️ SkippedПроверка пропущена

Стратегии слияния

bash
# Результат в истории:
# * Merge pull request #42
# |\
# | * feat: add feature C
# | * fix: fix bug
# | * feat: add feature B
# |/
# * previous commit

Плюсы: Полная история, понятно откуда изменения Минусы: Нелинейная история, много merge-коммитов


Draft Pull Request

bash
# Создать draft PR через CLI
gh pr create --draft --title "WIP: User dashboard"

Когда использовать:

  • Работа в процессе, хотите показать направление
  • Нужна ранняя обратная связь
  • Хотите запустить CI/CD для проверки

Draft PR не будет случайно смержен и визуально отличается от готовых PR.


Плюсы и минусы

ПреимуществаНедостатки
Контроль качества кодаЗамедление процесса разработки
Распространение знанийВозможные конфликты при долгом ревью
Документирование измененийТребует культуры ревью в команде
Автоматические проверкиOverhead для маленьких изменений
Защита важных ветокМожет блокировать при отсутствии ревьюеров

Вопросы интервьюера

Q: Чем PR отличается от MR?

Ничем функционально. PR — термин GitHub, MR — термин GitLab. Обе платформы позволяют настроить обе терминологии.

Q: Что такое squash merge?

Объединение всех коммитов PR в один перед слиянием. Даёт чистую историю main, но теряется детализация изменений.

Q: Как обычно настраиваются branch protection rules?

Требование ревью (1-2 approvals), прохождение CI проверок, запрет force push, запрет прямых коммитов в main.

Q: Что делать, если PR стал конфликтующим с main?

git fetch origin && git rebase origin/main или git merge origin/main, разрешить конфликты и push.

Q: Какой размер PR считается оптимальным?

200-400 строк кода. Большие PR получают поверхностный ревью, маленькие — легче проверять качественно.


Источники