Разрешить конфликты при слиянии веток

Конфликты слияния возникают, когда git не может автоматически объединить изменения из разных веток. Это происходит, когда в репозитории есть противоречивые изменения, сделанные в одних и тех же местах.

Причины возникновения конфликтов:

  • Одновременная работа нескольких людей над одними файлами.
  • Обновление локальной копии с сервера (git pull), когда изменения в удаленном репозитории противоречат вашим локальным правкам.
  • Слияние веток (git merge), если в них были сделаны разные изменения в одних и тех же участках кода.
  • Попытка отправки изменений (git push) в удаленный репозиторий, если в нем уже есть коммиты, противоречащие вашим локальным правкам.

Типы конфликтов:

Как выглядят конфликты в файлах

Когда git обнаруживает конфликт, он помечает проблемные участки специальными маркерами:

Общая часть текста до конфликта
<<<<<<< HEAD
Изменения в текущей ветке
=======
Изменения во входящей ветке
>>>>>>> branch-name

Где:

  • <<<<<<< HEAD — начало изменений в текущей ветке.
  • ======= — разделитель между версиями.
  • >>>>>>> branch-name — конец изменений из входящей ветки.

Разрешение конфликтов в командной строке

Чтобы разрешить конфликт с помощью командной строки:

  1. Определите файлы с конфликтами, выполнив команду:

    git status
    

    Файлы с конфликтами отобразятся с пометкой both modified.

  2. Откройте файл с конфликтом в текстовом редакторе.

  3. Найдите маркеры конфликта (<<<<<<<, =======, >>>>>>>).

  4. Выберите вариант решения конфликта:

    • Удалите ненужную версию.
    • Создайте новый код, объединяющий обе версии.

    После внесения изменений удалите все маркеры конфликта.

  5. Сохраните файл.

  6. Добавьте измененный файл в индекс:

    git add <имя_файла>
    
  7. Завершите слияние:

    git commit -m "Resolve merge conflict"
    
  8. Опубликуйте изменения:

    git push
    

Конфликты в файловой структуре (tree conflicts)

Чтобы разрешить конфликт, когда файл был изменен в одной ветке и удален в другой:

  1. Посмотрите статус конфликта:

    git status
    
  2. Выберите дальнейшее действие с файлом:

    • Чтобы оставить файл, выполните команду:

      git add <имя_файла>
      
    • Чтобы удалить файл, выполните команду:

      git rm <имя_файла>
      
  3. Завершите слияние:

    git commit -m "Resolve file deletion conflict"
    

Использование инструментов слияния

Для удобного разрешения конфликтов можно использовать графические инструменты.
Чтобы запустить настроенный инструмент слияния, например VS Code, Sublime Merge или другие, выполните команду:

git mergetool

Прерывание слияния

Чтобы отменить слияние и вернуться к состоянию до начала операции, выполните команду:

git merge --abort

См. также