Основы Unix / 2.3. Разрешение конфликтов объединения


Видео


Конфликт слияния

Предположим, что Вы работаете над каким-то проектом вместе с другом. Вы не распределили обязанности и можете работать над одной и той же частью проекта. Что будет, если в одном и том же месте будет написан разный код?

Давайте для начала создадим репозиторий на гитхабе с названием dummies-do-the-same

Скопируйте на следующей странице ссылку на репозиторий.


Моделирование конфликта

Создайте на рабочем столе две директории: you и yourFriend

Склонируйте репозиторий в первый каталог: git clone [данные с сайта]

Создайте в папке репозитория внутри you файл main.swift и откройте его в vim.

Затем создайте в файле что-нибудь простое:

import Foundation

var a = 0
  1. Добавьте файлы в отслеживание: git add -A
  2. Сделайте коммит git commit -m "Первый коммит"
  3. Отправьте файлы на сервер: git push origin master

 


Моделирование конфликта для Вашего друга

Перейдите в папку ~/Desktop/yourFriend: cd ~/Desktop/yourFriend/

Склонируйте репозиторий во второй каталог: git clone [данные с сайта]

 

И замените в файле main.swift var a = 0 на var a = 10:

 

  1. Добавьте файлы в коммит -> git add -A
  2. Закомиттьте это -> git commit -m "fixed a variable"
  3. Теперь отправьте данные на локальную машину: git pull origin master

Вы увидите сообщение что ничего нового нету:

 

Давайте добавим эти изменения на сервер: git push origin master

 


Начало конфликта

Теперь, не выгружая правки с сервера откройте файл main.swift в Вашем каталоге и исправьте то же самое, но на 11:

 

Отправьте коммит в локальную среду:

 

А теперь выгрузите данные с сервера:

 
Упс. А у Вас тут конфликт.

Откройте файл в vim и вас ждет странный текст:

 

Он показывает разницу в различных ветках

Введите git mergetool и Вы увидите дополнительны файлы файлы бэкапа.

Теперь просто нажмите enter.

 

Откроется редактор слияния файлов. Нажав внизу по кнопке Вы можете получить разные варианты автоматически или самостоятельно переделать в нижней панели конфликт. Измените переменную на 13 и сохраните изменения.

Теперь в терминале удалите исходный файл с расширением .orig: rm main.swift.orig

  Теперь отправьте коммит и загрузите его на сервер:

  Всё здорово.