Git: Конфликты

Теперь рассмотрим наиболее приближенный к реальности сценарий, когда несколько пользователей вносят изменения в один и тот же файл.

Предположим, у нас в репозитории есть файл firstFile.txt и репозиторий актуален у первого и второго пользователей:

Screen Shot 2015-12-01 at 17.25.33

Screen Shot 2015-12-01 at 17.26.04

 

Второй пользователь вносит свои изменения и делает commit:

Screen Shot 2015-12-01 at 17.30.25

 

.. А затем push:

Screen Shot 2015-12-01 at 17.31.47

 

Убедимся что в “основном репозитории” содержится актуальная (с изменениями от второго пользователя) версия файла:

Screen Shot 2015-12-01 at 17.33.10

 

Первый пользователь не сделал pull, поэтому в его локальном репозитории содержится старая (без учета изменений от второго пользователя) версия файла:

Screen Shot 2015-12-01 at 17.34.40

 

Теперь первый пользователь вносит свои изменения в файл и делает commit:

Screen Shot 2015-12-01 at 17.37.00

 

После этого, первый пользователь будет делать git push чтобы синхронизировать свои изменения с “основным репозиторием”.

 

Казалось бы первый пользователь вносит изменения последним, позже чем второй и его push должен создать новый commit в основном репозитории.

 

Но изменения вносимые первым и вторым пользователем могут быть взаимоисключающими, например первый пользователь может в скрипте указать Stop-Service а второй Stop-Service. А это как раз и есть потенциальный конфликт.

Поэтому логика такова, что перед внесением изменений первый пользователь должен ознакомится с тем, что сделал второй с момента их последней синхронизации через “общий репозиторий”.

Поэтому первый пользователь при попытке git push получит уведомление:

Screenshot at Dec 01 17-44-11

 

Решений этой ситуации, очевидно два: первый пользователь либо сохранит свою версию файла, либо удалит ее:

Screenshot at Dec 01 17-47-10

Screenshot at Dec 01 17-48-06

Screen Shot 2015-12-01 at 17.48.42

Screenshot at Dec 01 17-50-27

 

В итоге нам доступно несколько коммитов:

Screen Shot 2015-12-01 at 17.51.22

 

Изменения от второго пользователя не потеряны, но остались в истории:

Screenshot at Dec 01 17-55-09

 

Первый пользователь всегда может переключится на этот коммит выполнив git checkout и увидеть изменения от второго пользователя:

Screenshot at Dec 01 17-58-06

Screen Shot 2015-12-01 at 17.56.36

 

Оглавление цикла статей по Git.

Надеюсь озвученная информация будет полезной, а если нужна будет помощь — используйте форму на главной странице моего сайта.