Когда Git не может объединить две ветки автоматически, он приостанавливает процесс и оставляет конфликтующие изменения для вашего разрешения. На Mac используйте git status, чтобы найти затронутые файлы, сравните обе версии, отредактируйте каждый конфликт в продуманный объединенный результат, затем проиндексируйте изменения и завершите слияние. Главное — сохранить смысл обоих изменений, а не вслепую принимать одну сторону или полагать, что простое сохранение обоих блоков приведет к работоспособному коду.
Подтвердите операцию и защитите незавершенные правки
Откройте «Терминал» или встроенный терминал вашего редактора, перейдите в репозиторий и проверьте его состояние:
cd "/path/to/repository"
git status
Вместо примера укажите фактический путь к папке. Статус Git покажет, какие файлы не объединены и какой процесс выполняется: обычное слияние (merge), перемещение (rebase) или другое действие. В этой статье рассматривается слияние. При обычном слиянии Git оставляет текущую ветку на месте, пока ожидает от вас разрешения конфликтов; пути, которые объединились без конфликтов, уже обновлены, тогда как конфликтующие пути требуют проверки. Документация Git по git merge
Если у вас есть незакоммиченные изменения, сделанные до слияния, будьте внимательны, чтобы случайно не перезаписать их при редактировании. В документации Git упоминается команда git merge --abort как способ остановить слияние, но отмечается, что она не всегда может восстановить существовавшие ранее незакоммиченные изменения. Если состояние вызывает сомнения, сохраните отдельную копию важных локальных правок перед продолжением. Прерывайте слияние только тогда, когда вы действительно намерены его остановить, и обязательно проверяйте результирующий статус после этого. Инструкции Git по разрешению конфликтов слияния
Воспринимайте каждый конфликт как два предложения
Откройте каждый указанный файл в текстовом редакторе. Текстовый конфликт обычно выглядит следующим образом:
<<<<<<< HEAD
current branch version
=======
incoming branch version
>>>>>>> branch-name
Текст выше ======= — это, как правило, версия текущей ветки; текст ниже — версия присоединяемой ветки. Метки могут отличаться. Git сохраняет общего предка и версии обеих веток в индексе, а в рабочем файле отображает результат с метками конфликта для вашего редактирования. Документация Git по слиянию
Относитесь к этим двум разделам как к подтверждению планируемых изменений, а не как к вариантам, один из которых необходимо принять целиком. Подумайте, чего пытались добиться каждым изменением. Одна сторона могла добавить условие валидации, а другая — изменить имя поля; сохранение обоих изменений может означать их объединение в одно обновленное условие. В случае конфликта на уровне файлов (например, одна сторона удалила файл, а другая его отредактировала) решите, должен ли файл остаться, и если да — внесите необходимые правки. Если намерения неочевидны из самих строк, изучите соседний код или проконсультируйтесь с автором изменений перед принятием решения.
Удалите все маркеры конфликта и напишите согласованную итоговую версию. Не оставляйте просто оба блока друг за другом, если только это не является тем, что на самом деле должно содержаться в программе или документе. Сохранение обоих блоков может привести к дублированию объявлений, перезаписи поведения или синтаксическим ошибкам. И наоборот, выбор только одного блока может привести к потере полезной работы из другой ветки. Правильное разрешение зависит от окружающего контекста в файле и назначения каждого изменения.
Проверьте и проиндексируйте разрешенные файлы
Сохраните отредактированный файл, а затем просмотрите изменения. Для конфликтующего файла команда git diff показывает правки по разрешению конфликта, которые все еще присутствуют в вашем рабочем дереве. Проверяйте весь окружающий контекст, а не только отмеченные строки. Выполните поиск оставшихся маркеров с помощью функции поиска в редакторе или выполните следующую команду в репозитории:
git grep -n -E '^(<<<<<<<|=======|>>>>>>>)'
Если совпадения найдены, просмотрите их: легитимная документация или тестовые фикстуры также могут содержать эти строки, поэтому не удаляйте совпадения без разбора. Когда результат в файле станет корректным, проиндексируйте его, передав команде git add путь к нему в кавычках, например git add "Sources/Example.swift". Индексация сообщает Git, что конфликт в файле разрешен; однако она не гарантирует, что сам результат правильный. Инструкция Git заключается в следующем: отредактировать каждый конфликт, добавить разрешенные пути через add, а затем закоммитить или продолжить слияние. Документация Git по слиянию
Для визуальной работы на Mac в Visual Studio Code конфликтующие файлы перечислены в разделе Merge Changes (Изменения слияния) на панели «Система управления версиями». Откройте файл и используйте встроенные действия для конфликтов или нажмите Open in Merge Editor (Открыть в редакторе слияния), чтобы просмотреть текущую сторону, входящую сторону и итоговый результат. Действие редактора Accept Both Changes (Принять оба изменения) сохраняет обе секции последовательно; проверьте получившийся файл и объедините либо скорректируйте содержимое при необходимости. Сохраните результат и проиндексируйте файл в системе управления версиями. Эти элементы управления относятся к VS Code; другие редакторы могут использовать иные названия или функции. Руководство VS Code по конфликтам слияния
Завершите слияние и проверьте результат
После разрешения и индексации каждого конфликтующего файла снова проверьте состояние:
git status
git diff --cached
Просмотрите проиндексированный diff, чтобы убедиться, что оба запланированных изменения представлены в корректном итоговом виде и что посторонние правки не были включены. Запустите соответствующие проверки проекта, если они доступны; Git не может определить, ведет ли себя объединенная логика так, как задумывалось.
При слиянии через командную строку завершите операцию с помощью git merge --continue (или закоммитьте слияние, когда Git предложит это сделать). Параметр --continue в Git проверяет, что слияние находится в процессе выполнения, перед созданием коммита. Затем снова запустите git status, чтобы подтвердить, что слияние больше не выполняется. Если Git сообщает о дополнительных конфликтах, разрешите и проиндексируйте и эти файлы. Инструкции Git по слиянию
Конфликт считается безопасно разрешенным, когда итоговый файл осознанно учитывает работу обеих веток, проиндексированный diff соответствует этому результату, а слияние завершено. Если вы не можете определить, какую задачу решала та или иная сторона, остановитесь и уточните этот контекст, прежде чем отбрасывать или переписывать код.
Источники
Разрешение конфликтов слияния в VS Code — Microsoft