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

<html> <div class="content">

<img src="http://habrastorage.org/storage/eebea7f1/5482efc4/01467053/55589e0f.png" align="left">Это пятая часть из серии <b>Hg Init: Учебное пособие по Mercurial</b> от Джоэля Спольски (<a href="http://www.joelonsoftware.com/">Joel Spolsky</a>). Предыдущие части:<br>

<ul> <li><a href="http://docs.mirocow.com/doku.php?id=hg_init:%D1%87%D0%B0%D1%81%D1%82%D1%8C_1._%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9_subversion">«Переобучение для пользователей Subversion»</a></li> <li><a href="http://docs.mirocow.com/doku.php?id=hg_init:%D1%87%D0%B0%D1%81%D1%82%D1%8C_2._%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_mercurial">«Основы Mercurial»</a></li> <li><a href="http://docs.mirocow.com/doku.php?id=hg_init:%D1%87%D0%B0%D1%81%D1%82%D1%8C_3._%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_mercurial">«Привыкаем работать в команде»</a></li> <li><a href="http://docs.mirocow.com/doku.php?id=hg_init:%D1%87%D0%B0%D1%81%D1%82%D1%8C_4._%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8">«Исправляем ошибки»</a></li> </ul><br> <br> Иногда при слияниях возникают конфликты. Обычно их легко разрешить. В любом случае их надо разрешить, или у вас будет несколько «голов». А кому это нужно?<br> <br> <h4>Часть 5. Процесс слияния</h4><br> <br> <img src="http://habrastorage.org/storage/640e555c/1cbdb7a6/1c1be8ce/273818dc.png" align="left"><br> Обеспечение слаженной работы нескольких людей над одним и тем же кодом — это важная функция системы контроля версий.<br> <br> Представьте что и Роза, и я хотим внести изменения в рецепт гуакамоле. Роза работает над качеством авокадо. Перед тем как начать, она обновляет свой рабочий каталог, вытягивая свежие изменения из центрального репозитория.<br> <br> <a name="habracut"></a><br> <br> <img src="http://habrastorage.org/storage/49492ce5/6d5c159c/0fceb6e4/d1371e41.png"><br> <br> Теперь небольшая правка:<br> <br> <img src="http://habrastorage.org/storage/1f1b5727/aa9ead27/1baec231/ea75e210.png"><br> <br> Она фиксирует изменения и проталкивает их в центральный репозиторий:<br> <br> <img src="http://habrastorage.org/storage/eb48ca94/8b8d8084/faf52620/567fe487.png"><br> <br> В это же время я делаю изменение в другой части файла:<br> <br> <img src="http://habrastorage.org/storage/47aa2eae/b082887d/8f4efdf9/82c8204a.png"><br> <br> Я могу сделать коммит, но не могу протолкнуть изменения в центральный репозиторий. <br> <br> <img src="http://habrastorage.org/storage/06f7657f/f6e19411/72bbeee1/49613e14.png"><br> <br> Это, пожалуй, наименее полезное сообщение об ошибке в Mercurial. Лучше было бы так:<br> <br> <img src="http://habrastorage.org/storage/2668f993/5096053c/ca4cc74c/0a1bc81d.png"><br> <br> Так я и поступлю:<br> <br> <img src="http://habrastorage.org/storage/23989ae6/e098973a/29b71b73/28b63534.png"><br> <br> Хотите узнать, что за изменения только что были получены? Для этого есть удобный способ — команда

hg log -P .

<br> <br> <img src="http://habrastorage.org/storage/f37baadc/ba0e4f1c/8bb30299/ba53f194.png"><br> <br> Ну точно, это те изменения, что сделала Роза. И что там с моим репозиторием сейчас?<br> <br> <img src="http://habrastorage.org/storage/590062e4/7361c67f/c7495e4a/0dbc0c0a.png"><br> <br> У моего репозитория «несколько голов». По сути, мой репозиторий выглядит так:<br> <br> <img src="http://habrastorage.org/storage/3bd32436/06550de1/6c75bfe2/0aae9522.png"><br> <br> Видите две головы? Они появились, потому что Роза сделала свои изменения, работая с седьмым набором изменений, и я тоже сделал свои изменения, работая с тем же набором. Так что теперь требуется слияние (merge). [Редактор подсказывает, что нельзя использовать пассивный залог] <i>Я должен сделать слияние.</i><br> <br> <img src="http://habrastorage.org/storage/5621d82f/5d6acbb8/5eb36af3/cff77626.png"><br> <br> Команда слияния,

hg merge

, взяла две головы и объединила их. После этого она поместила результат в мой рабочий каталог. Она не закоммитила его. Это дает мне шанс проверить, что результат слияния корректен:<br> <br> <img src="http://habrastorage.org/storage/26e1e355/a577e02b/0523977e/f9da5180.png"><br> <br> Похоже на правду: авокадо сорта Хасс и <a href="http://ru.wikipedia.org/wiki/%D0%A5%D0%B0%D0%BB%D0%B0%D0%BF%D0%B5%D0%BD%D1%8C%D0%BE">перчики халапеньо</a>. Так что я сделаю коммит и протолкну изменения на сервер.<br> <br> <img src="http://habrastorage.org/storage/ae013a30/05787999/a42e347d/30c74efa.png"><br> <br> Я проталкиваю два набора изменений: мои изменения про халапеньо и результат слияния, который тоже является набором изменений.<br> <br> Обратите внимание на то, что в наших изменениях не было конфликтов, потому что Роза и я работали над разными частями рецепта. Потому слияние было супер-пупер простым. Это наиболее частая ситуация, потому что в большинстве организаций разные программисты работают над разными частями кода.<br> <br> Иногда бывают странные организации, в которых никто не готов стукнуть кулаком по столу и все-таки разделить зоны ответственности. Это может спровоцировать неожиданное и часто необъяснимое чувство грусти среди программистов. Эту ситуацию непросто распознать. Но есть симптомы: программисты закрываются в туалетах, программисты закрываются в серверных, высокая текучесть кадров, звуки сдавленных рыданий в помещении, а также неожиданное повреждение барабанных перепонок из-за многократных выстрелов штурмовой винтовки.<br> <br> НО, даже в самых замечательных организациях с наилучшим руководством конфликты при слиянии иногда случаются, и Mercurial потребует от того, кто делает слияние, разрешить конфликт. Давайте посмотрим как это делается.<br> <br> Для начала… я хочу чтобы Роза была в курсе моих изменений про халапеньо:<br> <br> <img src="http://habrastorage.org/storage/7cdb3d62/986ee692/5d621d00/dee47636.png"><br> <br> Сейчас мы увидим что случается когда у вас на-сто-я-щий конфликт: мы оба немного накосячим с ингредиентами.<br> <br> Я добавил банан:<br> <br> <img src="http://habrastorage.org/storage/4585d66a/853aff76/0d16a3ca/5cd2a054.png"><br> <br> И первым зафиксировал изменения:<br> <br> <img src="http://habrastorage.org/storage/7fc22261/c85df119/fbc1b69a/4dc22812.png"><br> <br> А Роза, господи прости, добавила МАНГО в ТОМ ЖЕ МЕСТЕ рецепта.<br> <br> <img src="http://habrastorage.org/storage/8ed8694b/d5f5a156/dfff95f9/d720b1fe.png"><br> <br> «Зрелый молодой» манго, я не шучу.<br> <br> <img src="http://habrastorage.org/storage/9b359d09/549796d6/52bb2564/634c9a94.png"><br> <br> В этот раз я первым зафиксировал изменения, так что теперь Розе придется заниматься слиянием. Ха-ха!<br> <br> <img src="http://habrastorage.org/storage/19d3e459/a1d10cb6/96edf235/f2a72de4.png"><br> <br> И вдруг, обнаруживается конфликт и выскакивает окошко какой-то программы для разрешения конфликтов со столь страшным интерфейсом, что только матери этой программы он может нравиться. Но программа обычно достаточно неплохо делает то, для чего предназначена, надо только разобраться как она работает. Наиболее распространенной программой для разрешения конфликтов в наше время является KDiff3, так что Роза увидит следующее:<br> <br> <img src="http://habrastorage.org/storage/98500077/99d1eff2/a1de7c3f/c0eadf2d.png"><br> <br> В программе KDiff3 у вас есть четыре панели. Верхняя левая — это оригинальный файл. Верхняя средняя показывает Розе ее версию файла. Верхняя правая показывает Розе мою версию. Нижняя панель — это редактор, в котором Роза собирает итоговый файл по мере разрешения конфликтов.<br> <br> Разрешать конфликты достаточно просто. Нужно пройтись по всем конфликтам и выбрать каким образом разрешить каждый из них. Роза сошла с ума и решила, что бананово-манговая гуакамоле не так уж плоха:<br> <br> <img src="http://habrastorage.org/storage/4293e69b/330834b3/9a5446e0/48dc158b.png"><br> <br> Кстати, я говорил вам, что Роза, похоже, кое с кем встречается? Как-то раз ее видели уходящей с работы с парнем, который выглядел примерно как <a href="http://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B0%D0%BD%D1%86,_%D0%94%D0%B5%D0%BD%D0%BD%D0%B8%D1%81">Деннис Франц</a>. В таком прекрасном настроении как тогда ее давненько не видели.<br> <br> Роза сохраняет изменения и закрывает KDiff3.<br> <br> <img src="http://habrastorage.org/storage/05f78199/f0a9e7f9/a8d54d4d/a5513301.png"><br> <br> И конфликт разрешен.<br> <br> Вот что вам стоит запомнить: вы не обязаны проводить слияние, подстраиваясь под чье-либо расписание. Вы можете выполнять

hg pull

когда угодно и, если не хочется сразу же разрешать конфликты, то можете свободно продолжать работать и счастливо коммитить до тех пор, пока не найдете время заняться слиянием.<br> <br> <h5>Проверь себя</h5><br> <br> Вот то, что вы должны уметь делать после прочтения данной части:<br> <ol> <li>Работать с кодом совместно с другими людьми.</li> <li>Получать их изменения.</li> <li>Проталкивать свои изменения.</li> <li>Разрешать конфликты, которые время от времени случаются.</li> <li>Диагностировать некоторые виды программерской меланхолии.</li> </ol><br> </html>

Заключительная часть здесь: Часть 6. Архитектура репозиториев