Pull to refresh

Hg Init: Часть 5. Процесс слияния

Reading time4 min
Views41K
Original author: Joel Spolsky
Это пятая часть из серии Hg Init: Учебное пособие по Mercurial от Джоэля Спольски (Joel Spolsky). Предыдущие части:


Иногда при слияниях возникают конфликты. Обычно их легко разрешить. В любом случае их надо разрешить, или у вас будет несколько «голов». А кому это нужно?

Часть 5. Процесс слияния




Обеспечение слаженной работы нескольких людей над одним и тем же кодом — это важная функция системы контроля версий.

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





Теперь небольшая правка:



Она фиксирует изменения и проталкивает их в центральный репозиторий:



В это же время я делаю изменение в другой части файла:



Я могу сделать коммит, но не могу протолкнуть изменения в центральный репозиторий.



Это, пожалуй, наименее полезное сообщение об ошибке в Mercurial. Лучше было бы так:



Так я и поступлю:



Хотите узнать, что за изменения только что были получены? Для этого есть удобный способ — команда hg log -P .



Ну точно, это те изменения, что сделала Роза. И что там с моим репозиторием сейчас?



У моего репозитория «несколько голов». По сути, мой репозиторий выглядит так:



Видите две головы? Они появились, потому что Роза сделала свои изменения, работая с седьмым набором изменений, и я тоже сделал свои изменения, работая с тем же набором. Так что теперь требуется слияние (merge). [Редактор подсказывает, что нельзя использовать пассивный залог] Я должен сделать слияние.



Команда слияния, hg merge, взяла две головы и объединила их. После этого она поместила результат в мой рабочий каталог. Она не закоммитила его. Это дает мне шанс проверить, что результат слияния корректен:



Похоже на правду: авокадо сорта Хасс и перчики халапеньо. Так что я сделаю коммит и протолкну изменения на сервер.



Я проталкиваю два набора изменений: мои изменения про халапеньо и результат слияния, который тоже является набором изменений.

Обратите внимание на то, что в наших изменениях не было конфликтов, потому что Роза и я работали над разными частями рецепта. Потому слияние было супер-пупер простым. Это наиболее частая ситуация, потому что в большинстве организаций разные программисты работают над разными частями кода.

Иногда бывают странные организации, в которых никто не готов стукнуть кулаком по столу и все-таки разделить зоны ответственности. Это может спровоцировать неожиданное и часто необъяснимое чувство грусти среди программистов. Эту ситуацию непросто распознать. Но есть симптомы: программисты закрываются в туалетах, программисты закрываются в серверных, высокая текучесть кадров, звуки сдавленных рыданий в помещении, а также неожиданное повреждение барабанных перепонок из-за многократных выстрелов штурмовой винтовки.

НО, даже в самых замечательных организациях с наилучшим руководством конфликты при слиянии иногда случаются, и Mercurial потребует от того, кто делает слияние, разрешить конфликт. Давайте посмотрим как это делается.

Для начала… я хочу чтобы Роза была в курсе моих изменений про халапеньо:



Сейчас мы увидим что случается когда у вас на-сто-я-щий конфликт: мы оба немного накосячим с ингредиентами.

Я добавил банан:



И первым зафиксировал изменения:



А Роза, господи прости, добавила МАНГО в ТОМ ЖЕ МЕСТЕ рецепта.



«Зрелый молодой» манго, я не шучу.



В этот раз я первым зафиксировал изменения, так что теперь Розе придется заниматься слиянием. Ха-ха!



И вдруг, обнаруживается конфликт и выскакивает окошко какой-то программы для разрешения конфликтов со столь страшным интерфейсом, что только матери этой программы он может нравиться. Но программа обычно достаточно неплохо делает то, для чего предназначена, надо только разобраться как она работает. Наиболее распространенной программой для разрешения конфликтов в наше время является KDiff3, так что Роза увидит следующее:



В программе KDiff3 у вас есть четыре панели. Верхняя левая — это оригинальный файл. Верхняя средняя показывает Розе ее версию файла. Верхняя правая показывает Розе мою версию. Нижняя панель — это редактор, в котором Роза собирает итоговый файл по мере разрешения конфликтов.

Разрешать конфликты достаточно просто. Нужно пройтись по всем конфликтам и выбрать каким образом разрешить каждый из них. Роза сошла с ума и решила, что бананово-манговая гуакамоле не так уж плоха:



Кстати, я говорил вам, что Роза, похоже, кое с кем встречается? Как-то раз ее видели уходящей с работы с парнем, который выглядел примерно как Деннис Франц. В таком прекрасном настроении как тогда ее давненько не видели.

Роза сохраняет изменения и закрывает KDiff3.



И конфликт разрешен.

Вот что вам стоит запомнить: вы не обязаны проводить слияние, подстраиваясь под чье-либо расписание. Вы можете выполнять hg pull когда угодно и, если не хочется сразу же разрешать конфликты, то можете свободно продолжать работать и счастливо коммитить до тех пор, пока не найдете время заняться слиянием.

Проверь себя


Вот то, что вы должны уметь делать после прочтения данной части:
  1. Работать с кодом совместно с другими людьми.
  2. Получать их изменения.
  3. Проталкивать свои изменения.
  4. Разрешать конфликты, которые время от времени случаются.
  5. Диагностировать некоторые виды программерской меланхолии.


Заключительная часть здесь:
Hg Init: Часть 6. Архитектура репозиториев
Tags:
Hubs:
Total votes 47: ↑45 and ↓2+43
Comments21

Articles