20. Git: система управления версиями для всех. Меньше теории, больше практики. Как делать слияние (merge) и разрешать возникающие конфликты

[1] Создание репозитория и потом из него bare репозитория

1) Создадим новую папку collab_source
2) Создадим в этой папке текстовый файл mycontent.txt с содержимым:
Unchanged first line from source
Second line
Third line

3) Сделаем из папки collab_source репозиторий Git и сделаем commit файла mycontent.txt с описанием "Base commit from source".
4) Создадим bare репозиторий:
git clone --bare /your/path/to/collab_source /your/path/to/bare_collab


[2] Как участникам команды присоединится к работе

git clone /path/to/repository/bare_collab /path/of/local/copy/Bob_collab
git clone /path/to/repository/bare_collab /path/of/local/copy/Lisa_collab


Дерево commit-ов выглядит на данном этапе следующим образом:


[3] Bob делает изменения

1) Он меняет первую строку и содержимое становится таким:
First line from source - Changed by Bob
Second line
Third line


2) Далее он добавляет изменения и фиксирует их:
git status
git add .
git commit -m 'Bobs first commit after changing the first line'
git log

3) Далее ему надо передать (push) свои изменения в общий bare репозиторий, но по хорошему сначала надо извлечь (pull) изменения, которые успели передать (push) члены команды до вас:
git pull
git push


[4] Lisa делает собственные изменения

1) Ее изменения выглядят так:
Unchanged first line from source = Not any more ;) - Lisa
Second line
Third line
Fourth line by Lisa


2) Далее она добавляет изменения и фиксирует их:
git status
git add .
git commit -m 'Lisa's first commit after changing the first line and adding a new fourth line'
git log

3) Далее перед тем как передать (push) свои изменения в общий bare репозиторий, она делает извлечение (pull) изменений, которые успели передать (push) другие члены команды:

Возник merge конфликт

[5] Разрешение merge конфликта

1) Если Lisa откроет файл то увидит следующее:
<<<<<<< HEAD
Unchanged first line from source = Not any more ;) - Lisa
=======

First line from source - Changed by Bob
>>>>>>> 9bab0336e6c9ab984b538f1f7724bf8a9703f55e

Second line
Third line
Fourth line by Lisa


2) Есть следующие варианты:
  • Указать порядок и применить оба изменения (т.е. и Боба и Лизы);
  • Удалить имеющиеся изменения и наложить ваши изменения;
  • Удалить ваши изменения и применить извлеченные;
  • Удалить оба.
3) Рассмотрим первый вариант. Лиза чувствует что изменения Боба более важные и придает им высший порядок. Поэтому она открывает файл и делает следующие изменения:
First line from source - Changed by Bob
Unchanged first line from source = Not any more ;) - Lisa
Second line
Third line
Fourth line by Lisa


Чтобы не делать изменения вручную можно использовать интерактивный инструмент meld. В нем есть три вида (local, base, и remote).  Local - это текущая модифицированная версия, base - это прежняя версия без вашей модификации, и remote - это модифицированная удаленная версия. Используя доступные стрелки и индикаторы можно упорядочить изменения.

git add .
git commit -m "Merge - Posted Bob's change to the top followed by mine"
git status
git log

git push


C3 - локальный commit от Лизы
C2 - commit от Боба
С4 - новый commit представляющий собой объединенние C3 и C2

4) Чтобы посмотреть граф истории через Git Gui надо зайти в Repository | Visualize all branch history:


В CLI режиме можно воспользоваться командой git log --graph

git log --graph

[6] Синхронизация остальных членов команды с bare репозиторием

1) Боб может обновиться следующим образом:
git pull
git log

2) Материнский репозиторий можно обновить следующим образом:
git remote add origin /path/to/bare_collab
git pull –u origin master

Добавление remote это одноразовая операция, т.е. добавив однажды можно потом добавлять не нужно.