middle
Как разрешить конфликт при merge/rebase?
Конфликт — это ситуация, когда Git не может автоматически объединить изменения в одних и тех же строках файла из разных веток.
Аналогия из жизни: два редактора одновременно правят один и тот же абзац статьи. Когда правки нужно объединить, редактор-координатор (вы) должен решить, чью версию оставить или как совместить обе.
Маркеры конфликта
При конфликте Git помечает проблемные участки в файле специальными маркерами:
Пример
public class UserService {
<<<<<<< HEAD
private final AuthService authService;
private final UserRepository userRepo;
=======
private final AuthenticationService authService;
private final UserDAO userDao;
>>>>>>> feature/refactor-auth
}
<<<<<<< HEAD— начало изменений из текущей ветки=======— разделитель>>>>>>> feature/...— конец изменений из вливаемой ветки
Процесс разрешения конфликта при merge
Пример
# 1. Начинаем merge
git merge feature/auth
# CONFLICT (content): Merge conflict in src/UserService.java
# 2. Смотрим, какие файлы конфликтуют
git status
# both modified: src/UserService.java
# 3. Открываем файл и вручную редактируем — убираем маркеры, оставляем нужный код
# 4. Добавляем исправленные файлы
git add src/UserService.java
# 5. Завершаем merge
git commit
# Git автоматически подставит сообщение о merge
Процесс разрешения конфликта при rebase
Пример
# 1. Начинаем rebase
git rebase main
# CONFLICT in src/UserService.java
# 2. Разрешаем конфликт в файле
# 3. Добавляем исправленный файл
git add src/UserService.java
# 4. Продолжаем rebase (НЕ commit!)
git rebase --continue
# Если возникнут конфликты в следующем коммите — повторяем шаги 2-4
Отмена merge/rebase
Пример
# Отменить merge (вернуться к состоянию до merge)
git merge --abort
# Отменить rebase (вернуться к состоянию до rebase)
git rebase --abort
Использование mergetool
Пример
# Запустить визуальный инструмент для разрешения конфликтов
git mergetool
# Настроить инструмент по умолчанию
git config --global merge.tool vimdiff
# Или для IntelliJ IDEA:
git config --global merge.tool intellij
Стратегии выбора при конфликте
Пример
# Принять все изменения из нашей ветки
git checkout --ours src/UserService.java
# Принять все изменения из вливаемой ветки
git checkout --theirs src/UserService.java
Ключевые моменты
- При rebase конфликт может возникать на каждом коммите (так как коммиты применяются по одному), при merge — один раз
- Команда
git rebase --continueпродолжает rebase после разрешения конфликта. Не используйтеgit commitпри rebase - Использование
--oursи--theirsполностью заменяет файл одной из версий — используйте аккуратно - Всегда проверяйте результат разрешения конфликта — компиляция и тесты должны проходить
Частые ошибки
- Оставлять маркеры конфликта (
<<<<,====,>>>>) в коде — файл не скомпилируется - Использовать
git commitвместоgit rebase --continueпри разрешении конфликта во время rebase - Принимать «свою» версию целиком без анализа — можно потерять чужие изменения
- Не запускать тесты после разрешения конфликтов
Как используется в 2026
- IDE (IntelliJ IDEA, VS Code) предоставляют удобный трёхпанельный интерфейс для разрешения конфликтов
- AI-ассистенты помогают анализировать и предлагать варианты разрешения конфликтов
- Merge queues в GitHub/GitLab автоматически перебазируют и проверяют ветки перед merge, минимизируя конфликты
- Частые маленькие PR и trunk-based development снижают вероятность конфликтов
На собеседовании: интервьюер проверяет практический опыт. Опишите пошаговый процесс: увидеть конфликт в
git status, открыть файл, убрать маркеры,git add,git commit(merge) илиgit rebase --continue(rebase). Упомяните--abortдля отмены и что при rebase конфликты могут возникать на каждом коммите.