Короткий ответ
Каждый аналитик ведёт изменения в отдельной ветке от актуального main, оформляет pull request с ревью перед слиянием, а конфликт слияния разрешается вручную: нужно понять смысл обеих версий кода, а не слепо выбрать «свою» или «чужую» сторону, и затем протестировать объединённый запрос.
Как это работает подробнее
- Как это работает: при одновременном изменении одних и тех же строк файла в разных ветках Git не может автоматически выбрать версию и помечает конфликт маркерами
<<<<<<<,=======,>>>>>>>в файле; feature-branch workflow подразумевает, что main всегда в рабочем состоянии, а изменения попадают туда только через review.
Пример кода
resolve_conflict.sql
<<<<<<< HEAD
WHERE order_date >= '2024-01-01'
AND status = 'paid'
=======
WHERE order_date >= '2024-01-01'
AND region = 'EU'
>>>>>>> feature/eu-filter
WHERE order_date >= '2024-01-01'
AND status = 'paid'
AND region = 'EU'Что использовать на практике
- На практике: перед началом работы нужно обновить ветку от main (
git pull/git rebase), небольшие и частые PR снижают вероятность конфликтов и облегчают ревью; при конфликте важно понять бизнес-логику обеих версий изменения (например, оба добавили разные фильтры в WHERE) и объединить их осмысленно, а не удалить одну из частей наугад. - Пример и проверка. Правильное объединение — сохранить оба условия, если оба фильтра нужны одновременно: Проверка: запустить итоговый запрос на тестовой выборке и сравнить число строк с ожидаемым (пересечение обоих фильтров должно быть не больше, чем результат любого из них по отдельности).
Подводные камни
- Частые ошибки: работать месяцами в одной долгоживущей ветке без слияния с main, из-за чего конфликт становится огромным и трудноразрешимым; разрешать конфликт, бездумно оставляя «свою» версию целиком, что приводит к потере чужих изменений; не тестировать запрос после разрешения конфликта, из-за чего в main попадает синтаксически рабочий, но логически неверный SQL.