Чтобы еще раз прояснить когда возникают конфликты слияния рассмотрим один простой пример.
Я создал проект, в который добавил один файл test.txt. Перед каждым коммитом я добавлял в него одну строку и так сделал три коммита – A, B и C в ветке master. Таким образом в коммите С, который был третьим по счету в файле test.txt было три строки:
- Коммит A
- Коммит B
- Коммит C
Затем сделал ветвь idea1 и сделал там еще один коммит D, добавив в файл еще одну строку. Таким образом файл в коммите D содержит четыре строки:
- Коммит A
- Коммит B
- Коммит C
- Коммит D
Затем я вернулся в ветку master и сделал там еще один коммит E, так же добавив в файл одну строку. Но поскольку на момент переключения в ветку master, там было три строки (Коммит A, B, C), то я добавил четвертую. Таким образом файл в коммите E выглядит следующим образом
- Коммит A
- Коммит B
- Коммит C
- Коммит E
Чтобы все было нагляднее приведу диаграмму всех этих действий
Из диаграммы видно как последовательно менялось содержимое файла test.txt в коммитах A,B и C. Затем после коммита была создана ветка idea1 и в ней новый коммит D в котором была добавлена ЧЕТВЕРТАЯ строка в файл test.txt.
Красные стрелки между коммитами указывают на их предков. Хронологическая же последовательность коммитов слева на право (A->B->C->D->E). В прямоугольниках под каждым коммитом показано содержимое файла test.txt каждого коммита.
Затем я вернулся на ветку master и сделал там коммит E, в который попали изменения файла test.txt. А именно туда была добавлена ЧЕТВЕРТАЯ строка.
Из диаграммы видно что именно она и вызвала конфликт слияния, поскольку ЧЕТВЕРТАЯ строка разная в коммитах E и D.
После команды git merge idea1 в ветке master файл test.txt пришел в вид показанный на диаграмме (в синем фоне – в редакторе Far manager). Где как раз Git сделал изменения показав где, что и с чем конфликтует.
И собственно он нам предложил самим разобраться с этим конфликтом. И когда мы сами решим что же мы оставим в файле test.txt отредактировав его как нам надо и дав команду git add test.txt, чтобы добавить его в в новый коммит.
Команда git status на этом этапе покажет нам следующее:
Если мы сейчас дадим команду git mergetool, то увидим следующее (при условии что у вас настроен ExamDiff Pro):
Графические утилиты разрешения конфликтов, как правило, предоставляют хороший интерфейс для редактирования конфликтов слияния.
Это пример простого трёхходового слияния. Git взял вершины сливаемых веток коммиты D и E и их общего предка коммит C и предоставил нам сделать самим выбор что же мы хотим получить в конце концов.
Я поправил это таким образом:
Теперь если посмотрим статус то увидим:
Красные это файлики, которые оставил после совей работы сравнения и слияния ExamDiffPro. Их можно просто удалить из каталога проекта.
Закоммитим наши изменения и посмотрим лог и граф наших коммитов:
Надеюсь это небольшое упражнение дополнило ваше понимание о конфликтах и их разрешениях при слиянии веток.
Комментариев нет:
Отправить комментарий