Рассмотрим возможности разрешения конфликтов при работе в системой контроля версий 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

Конфликт разрешен. Всё хорошо. Решать конфликты не сложно.