среда, 18 февраля 2015 г.

Ветвление в Git – практика слияния веток (часть 1)

Чтобы еще раз прояснить когда возникают конфликты слияния рассмотрим один простой пример.

Я создал проект, в который добавил один файл test.txt. Перед каждым коммитом я добавлял в него одну строку и так сделал три коммита – A, B и C в ветке master. Таким образом в коммите С, который был третьим по счету в файле test.txt было три строки:

  1. Коммит A
  2. Коммит B
  3. Коммит C

Затем сделал ветвь idea1 и сделал там еще один коммит D, добавив в файл еще одну строку. Таким образом файл в коммите D содержит четыре строки:

  1. Коммит A
  2. Коммит B
  3. Коммит C
  4. Коммит D

Затем я вернулся в ветку master и сделал там еще один коммит E, так же добавив в файл одну строку. Но поскольку на момент переключения в ветку master, там было три строки (Коммит A, B, C), то я добавил четвертую. Таким образом файл в коммите E выглядит следующим образом

  1. Коммит A
  2. Коммит B
  3. Коммит C
  4. Коммит E

Чтобы все было нагляднее приведу диаграмму всех этих действий

M0001

 

Из диаграммы видно как последовательно менялось содержимое файла 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 на этом этапе покажет нам следующее:

M0002

Если мы сейчас дадим команду git mergetool, то увидим следующее (при условии что у вас настроен ExamDiff Pro):

M0003

Графические утилиты разрешения конфликтов, как правило, предоставляют хороший интерфейс для редактирования конфликтов слияния.

Это пример простого трёхходового слияния. Git взял вершины сливаемых веток коммиты D и E и их общего предка коммит C и предоставил нам сделать самим выбор что же мы хотим получить в конце концов.

Я поправил это таким образом:

M0004

Теперь если посмотрим статус то увидим:

M0005

Красные это файлики, которые оставил после совей работы сравнения и слияния ExamDiffPro. Их можно просто удалить из каталога проекта.

Закоммитим наши изменения и посмотрим лог и граф наших коммитов:

M0006

Надеюсь это небольшое упражнение дополнило ваше понимание о конфликтах и их разрешениях при слиянии веток.

Комментариев нет:

Отправить комментарий