Рассмотрим возможности разрешения конфликтов при работе в системой контроля версий Git.
Чаще всего конфликты возникают при слиянии веток. Например, когда один и тот же файл проекта менялся по разному в разных ветках. В одной ветке вы в файле удалили строчку, а в ветке master вы изменили эту же строчку в этом же файле.
При слиянии этих двух веток возникнет конфликт, т.к. Git не способен за вас решить какие из всех изменений более правильные и не будет сливать ветки автоматически. Git предложит вам разрешить конфликт.
Давайте попробуем слить две ветки из нашего примера командой:
$ git merge <commit_name>
Получим следующее сообщение:
Где видно, что Git предупреждает о конфликте: Merge conflict in index.html. Также на скриншоте видно, что в файлом css/button.css всё прошло хорошо и слияние было успешным.
Проверяем всё командой:
$ git status
При этом Гит нам подсказывает что можно сделать:
Он рекомендует исправить конфликты и закоммитить результат: fix conflicts and run "git commit".
Мы видим для файла index.html статус both modified. Это значит, что он изменен в обоих ветках.
Открываем файл в редакторе.
$ vim index.html
Вот как будет выглядеть файл в редакторе Vim:
В файле появились какие-то непонятные символы - стрелки, равно и указатели HEAD и search-page (выделено на скриншоте серым цветом). Так выглядит типичный конфликт.
Код между угловыми скобками и до равно - это код в файле в ветке в которой мы находимся. А после равно и до вторых угловых скобок - код в ветке, которую мы хотим слить с основной.
Нам нужно выбрать один из вариантов или оставить оба варианта и удалить все эти разделители. После этого мы сохраняем файл и делаем коммит.
$ git add index.html
$ git commit -m "merged search-page to master"
Далее посмотрим что у нас получилось:
$ git log --oneline --graph -6
Получаем такой лог:
Мёрдж прошел успешно, что мы видим в логе там где HEAD.
Если есть конфликт в ситуации когда в одной ветке файл удален, а в другой изменен, то этот конфликт разрешается таким же образом.
Например, у нас такая ситуация и git status показывает следующее:
Здесь у нас странный статус: deleted by us (рус. - удален нами). Текущая ветка по мнению Гит - мы (us), а ветку, которую мы вливаем, - они (they).
В итоге, для разрешения конфликта нам нужно либо удалить файл, либо сохранить.
Если мы оставляем файл, то используем команду:
$ git add <file_name>
Если мы хотим удалить файл из индекса, то используем известную нам команду rm:
$ git rm <file_name>
После этого делаем коммит и дальше проверяем лог командой:
$ git log --oneline --graph -5
Конфликт разрешен. Всё хорошо. Решать конфликты не сложно.