<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Очередной блог фрилансера &#187; mercurial</title>
	<atom:link href="http://dreamhelg.ru/tag/mercurial/feed/" rel="self" type="application/rss+xml" />
	<link>http://dreamhelg.ru</link>
	<description>о моей работе в сети и не только</description>
	<lastBuildDate>Fri, 23 Dec 2011 07:10:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Меркуриал. Разрешение конфликтов</title>
		<link>http://dreamhelg.ru/2009/12/mercurial-resolve-conflicts/</link>
		<comments>http://dreamhelg.ru/2009/12/mercurial-resolve-conflicts/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 08:12:19 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[общая]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[tortoiseHG]]></category>
		<category><![CDATA[инструменты]]></category>
		<category><![CDATA[контроль версий]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1766</guid>
		<description><![CDATA[<p><img width="192" height="200" src="http://dreamhelg.ru/wp-content/uploads/2009/12/konflict_08.jpg" class="attachment-200x200 wp-post-image" alt="konflict_08" title="konflict_08" /></p>В <a href="http://dreamhelg.ru/2009/09/mercurial-merge-work/">предыдущей статье</a>, мы рассматривали совместную работу над одним проектом, изучив базовые приемы объединения двух различных репозиториев в один. В сегодняшней статье, мы рассмотрим более сложную ситуацию – разрешение конфликтующих изменений.<span id="more-1766"></span>Итак, как вы уже заметили ранее, большинство объединений выполняется очень просто, но из всякого правила бывают исключения. Иногда, вы можете столкнуться с тем, что каждая сторона изменений затрагивает одну и ту же часть, одного и того же файла. И если обе модификации не идентичны, то слияние приведет к образованию конфликта, в котором вам придется решить, каким образом «помирить» различные изменения, чтобы получить правильный результат.

<strong>Рисунок 3.4. Конфликтующие изменения документа</strong>

<img class="aligncenter size-full wp-image-1778" title="schema" src="http://dreamhelg.ru/wp-content/uploads/2009/12/schema.png" alt="schema" width="475" height="500" />

Рисунок 3.4.  иллюстрирует пример двух конфликтующих изменений одного и того же документа. Мы начнем с создания первоначальной версии файла, затем произведем в нем небольшие изменения, в то время как кто-нибудь другой, изменит ту же часть текста. Наша задача в разрешении конфликтующих изменений – решить, как именно должен выглядеть наш файл после объединения.

Меркуриал не имеет встроенной возможности разрешения конфликтов. Вместо этого, он использует внешнюю программу, имеющую графический интерфейс.
<h3>Рабочий пример</h3>
В разрешении конфликтующих изменений нет ничего сложного, и сейчас мы на примере разберем эту задачу.

Первое, что нам понадобится – это исходный репозиторий с файлом, который мы впоследствии будем изменять. Создаем папку <em>first</em>, внутри которой, создаем простой текстовый файл, с именем <em>letter.txt</em>, с одним единственным, знакомым многим, предожением:

<img class="aligncenter size-full wp-image-1768" title="letter" src="http://dreamhelg.ru/wp-content/uploads/2009/12/letter.jpg" alt="letter" width="467" height="187" />

Далее запускаем внутри папки командную строку, и поочередно выполняем следующие команды:

<code>$ hg init

$ hg add letter.txt

$ hg commit –m “исходная версия текстового файла”
</code>

Здесь, мы сначала создаем репозиторий, затем добавляем в него наш файл <em>letter.txt</em>, и сохраняем его начальную версию. То же самое можно сделать с помощью графического интерфейса, через контекстное меню, доступное по правому клику мыши.

Далее, клонируем репозиторий <em>first</em>, в репозиторий под названием <em>first-one</em>. Снова используем командную строку:

<code>$ cd ..

$hg clone first first-one</code>

Если вы все сделали правильно, у вас должна появится новая папка с именем <em>first-one</em>, заходим в нее и смело изменяем копию файла <em>letter.txt</em>:

<img class="aligncenter size-full wp-image-1770" title="letter-two" src="http://dreamhelg.ru/wp-content/uploads/2009/12/letter-two.jpg" alt="letter-two" width="486" height="188" />

Сохраняем изменения, и создаем новый коммит:

<code>$ cd first-one

$ hg commit –m “название булок изменено на норвежские”</code>

Отлично, наш первый репозиторий с изменениями готов. Теперь снова вернемся к изначальному репозиторию <em>first</em>, и клонируем его еще раз. В этот раз, имя клонированного репозитория будет <em>first-second</em>:

<code>$ cd ..

$ hg clone first first-second</code>

Заходим внутрь только что клонированного репозитория <em>first-second</em>, и снова изменяем копию файла <em>letter.txt</em>:

<img class="aligncenter size-full wp-image-1769" title="letter-three" src="http://dreamhelg.ru/wp-content/uploads/2009/12/letter-three.jpg" alt="letter-three" width="461" height="185" />

И снова повторяем действия второго этапа, записываем наши изменения:

<code>$ cd first-second

$ hg commit –m “название булок изменено на австрийские”</code>

Отлично, теперь у нас есть две копии одного репозитория, с разными изменениями одной и той же части предложения. Переходим к главной части нашего примера – к объединению. Для того, чтобы не было путаницы, создадим из репозитория <em>first-one</em> клон, и назовем его <em>first-merge</em>. Он как раз и будет содержать объединенные версии двух репозиториев.

<code>$ cd ..

$ hg clone first-one first-merge

$ cd first-merge

$ hg pull –u ../first-second</code>

В вышеприведенном коде, кроме того что мы клонировали новый репозиторий <em>first-merge</em>, мы еще затянули в него изменения из репозитория <em>first-second</em>, так что сейчас он содержит два набора взаимоисключающих изменений. Теперь самое интересное, нам нужно их объединить, так что смело запускаем команду:

<code>$ hg merge</code>

И перед вами должна предстать графическая утилита <strong>Kdiff3</strong>, предназначенная специально для разрешения конфликтов:

<img class="aligncenter size-full wp-image-1772" title="kDiff3" src="http://dreamhelg.ru/wp-content/uploads/2009/12/kDiff3.jpg" alt="kDiff3" width="615" height="438" />

Как раз, на представленном выше скриншоте, она сообщает нам, что у нас есть один конфликт, который не возможно разрешить автоматически. А нам и не нужно автоматически, поэтому жмем кнопку ОК, и внимательно смотрим на окошко:

<img class="aligncenter size-full wp-image-1773" title="kDiff3-2" src="http://dreamhelg.ru/wp-content/uploads/2009/12/kDiff3-2.jpg" alt="kDiff3-2" width="620" height="455" />

Здесь по порядку слева направо отображается:
<ul>
	<li><strong>A</strong> -  набор изменений после которого началась развилка</li>
	<li><strong>B</strong> -  набор изменений, содержащийся в репозитории <em>first-one</em></li>
	<li><strong>C</strong> - набор изменений, затянутый из репозитория first-<em>second</em>.</li>
</ul>
Итак, для того чтобы разрешить конфликтную ситуацию, нам нужно решить, какое же изменение стоит использовать в конечном итоге. Предположим, что свежие австрийские булки будут гораздо лучше на вкус, чем черствые норвежские, поэтому, мы решаем использовать набор изменений <strong>C</strong>, который был получен из репозитория <em>first-second</em>.

Для того чтобы использовать ревизию <strong>C</strong>, можно воспользоваться соответствующей кнопкой на панели инструментов, или пунктом меню «<em>Merge – Select Line(s) from C</em>»

<img class="aligncenter size-full wp-image-1774" title="kDiff3-merge" src="http://dreamhelg.ru/wp-content/uploads/2009/12/kDiff3-merge.jpg" alt="kDiff3-merge" width="620" height="455" />

После этого нажимаем кнопку сохранить, и все окошко можно закрыть. И последний этап – создание коммита полученного объединения, как обычно воспользуемся привычной командой:

<code>$ hg commit –m “объединение двух версий”</code>

Теперь если воспользоваться командой контекстного меню «<em>TortoiseHG – View Changelog</em>», мы сможем увидеть как были объединены наши конфликтующие ветки:

<img class="aligncenter size-full wp-image-1771" title="changelog" src="http://dreamhelg.ru/wp-content/uploads/2009/12/changelog.jpg" alt="changelog" width="672" height="307" />

В данном примере мы рассмотрели простейший конфликт, однако, в процессе совместной работы над проектом, таких конфликтов может быть огромное количество. С помощью утилиты kDiff3,  вы можете либо обрабатывать конфликты построчно, как мы только что сделали и для каждой строки назначать определенную ревизию, либо указать нужную ревизию для всех возникших конфликтов. В этом случае, указанная вами ревизия заменит своим содержанием все конфликтующие изменения, поэтому используйте ее аккуратно.

В статье использовались материалы книги "<a href="http://hgbook.red-bean.com/read/">Mercurial: The Definitive Guide</a>", автор <strong>Bryan O'Sullivan </strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2009/12/mercurial-resolve-conflicts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Основы Меркуриала: объединение работы</title>
		<link>http://dreamhelg.ru/2009/09/mercurial-merge-work/</link>
		<comments>http://dreamhelg.ru/2009/09/mercurial-merge-work/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 15:54:14 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[общая]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[tortoiseHG]]></category>
		<category><![CDATA[инструменты]]></category>
		<category><![CDATA[контроль версий]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1200</guid>
		<description><![CDATA[&#171;Одна голова &#8212; хорошо, а две лучше&#187;. Эта пословица как нельзя лучше походит к теме сегодняшней статьи о Меркуриале. После изучения в предыдущей статье базовых приемов и команд, необходимых для [...]]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2009/09/mercurial-merge-work/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Введение в Mercurial. Основы</title>
		<link>http://dreamhelg.ru/2009/07/mercurial-the-basics/</link>
		<comments>http://dreamhelg.ru/2009/07/mercurial-the-basics/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 09:38:44 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[общая]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[tortoiseHG]]></category>
		<category><![CDATA[инструменты]]></category>
		<category><![CDATA[контроль версий]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=748</guid>
		<description><![CDATA[Сегодня, я наконец-то  публикую долгожданную статью про Меркуриал, точнее про его основы. Не кривитесь и не делайте вид что вам это не интересно и не нужно, потому что система контроля [...]]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2009/07/mercurial-the-basics/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Система контроля версий Mercurial tortoiseHg</title>
		<link>http://dreamhelg.ru/2009/02/tortoisehg/</link>
		<comments>http://dreamhelg.ru/2009/02/tortoisehg/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 13:53:22 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[общая]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[tortoiseHG]]></category>
		<category><![CDATA[контроль версий]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=189</guid>
		<description><![CDATA[В своем втором посте, я писала об инструментах, которые я использую при работе с версткой, где среди прочего указывала систему контроля версий Mercurial TortoiseHg. И сегодня, в связи с участившимися [...]]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2009/02/tortoisehg/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

