Какие бывают конфликты при merge и как с ними работать?
Что проверяют
Для QA вопрос двойной: умеете ли вы сами работать в репозитории с автотестами и понимаете ли, что чистый merge не гарантирует рабочий код. Следом часто спрашивают, чем merge отличается от rebase и что вы проверяете после слияния крупных веток.
Как отвечать
Сначала виды конфликтов:
- содержимое: обе ветки изменили одни и те же или соседние строки. Git ставит маркеры
<<<<<<<,=======,>>>>>>>; - изменение и удаление: в одной ветке файл правили, в другой удалили (modify/delete);
- add/add и rename/rename: оба добавили файл по одному пути или по-разному переименовали один и тот же файл;
- бинарные файлы и lock-файлы: построчно не сливаются.
package-lock.jsonруками не правят, а берут версию из основной ветки и заново выполняютnpm install; - семантический конфликт: Git слил всё без вопросов, но один переименовал метод в Page Object, а другой добавил тест со старым именем. Такое ловит только сборка и прогон тестов.
Порядок работы: git status показывает файлы в конфликте, дальше правка в редакторе или в трёхстороннем merge-инструменте IDE, потом git add и git commit (при rebase вместо коммита git rebase --continue). Если всё пошло не так, git merge --abort возвращает состояние до слияния. Взять одну сторону целиком можно через git checkout --ours или --theirs. Настройка merge.conflictStyle zdiff3 добавляет в маркеры исходную версию, и намерения обеих сторон понять проще.
Профилактика: короткие ветки, регулярный rebase на основную, небольшие PR. После разрешения конфликта прогоните затронутые тесты локально, не дожидаясь CI.
Где спотыкаются
Разрешают конфликт, выбирая свою версию целиком. Так молча теряются чужие правки, а всплывает это уже на ревью или в упавших тестах.
Путают --ours и --theirs при rebase. Там стороны меняются местами: «наша» это ветка, на которую вы переносите коммиты.
Считают, что переименование файла в одной ветке и правка в другой всегда дают конфликт. Git обычно отслеживает переименование и сливает такое сам. Опаснее обратная ситуация: конфликта нет, а логика сломалась.