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

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

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

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

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

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

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

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

Где:

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

Разрешение конфликтов

Важно

Разрешение конфликтов в файловой структуре недоступно в интерфейсе SourceCraft. Для разрешения таких конфликтов используйте командную строку.

  1. Откройте главную страницу SourceCraft.

  2. На вкладке Домой в секции Ваша мастерская перейдите в раздел Репозитории.

  3. Выберите репозиторий.

  4. На странице репозитория в разделе Код перейдите в секцию Предложения изменений.

  5. Выберите предложение изменений и в правом верхнем углу нажмите Принять.

  6. На странице предложения изменений изучите сообщение о конфликтах, например:

    Объединение заблокировано
    ...
    В этой ветке есть конфликты, которые нужно разрешить
    filename.js
    CONFLICT (content): Automatic merge failed to resolve conflict in filename.js; Manual content merge required
    
  7. Нажмите Разрешить в интерфейсе.

  8. Откроется интерфейс редактирования кода, где будут помечены проблемные участки специальными маркерами:

     1    ...
     2    Общая часть текста до конфликта
     3    ...
          [Принять текущее] [Принять входящее] [Принять оба изменения]
     4    <<<<<<< main
     5    Изменения в текущей ветке
     6    =======
     7    Изменения во входящей ветке
     8    >>>>>>> feature-branch
     9    ...
    10    Общая часть текста после конфликта
    11    ...
    

    Где:

    • Принять текущее, Принять входящее, Принять оба изменения — кнопки для разрешения отдельного конфликта.
    • <<<<<<< main — начало изменений в текущей ветке.
    • ======= — разделитель между версиями.
    • >>>>>>> feature-branch — конец изменений из входящей ветки.
  9. Разрешите конфликты:

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

      • Принять текущее — принять изменения из текущей ветки.
      • Принять входящее — принять изменения из входящей ветки.
      • Принять оба изменения — принять изменения из обеих веток.
    • Чтобы разрешить все конфликты, справа вверху нажмите:

      • Принять текущий — принять все изменения из текущей ветки.
      • Принять входящий — принять все изменения из входящей ветки.

      Важно

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

  10. Нажмите Пометить решенным и Сохранить изменения.

  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

См. также