<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dw="https://www.dreamwidth.org">
  <id>tag:dreamwidth.org,2011-04-07:754492</id>
  <title>wizzard</title>
  <subtitle>wizzard</subtitle>
  <author>
    <name>wizzard</name>
  </author>
  <link rel="alternate" type="text/html" href="https://wizzard.dreamwidth.org/"/>
  <link rel="self" type="text/xml" href="https://wizzard.dreamwidth.org/data/atom"/>
  <updated>2014-03-21T15:56:44Z</updated>
  <dw:journal username="wizzard" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:754492:361458</id>
    <link rel="alternate" type="text/html" href="https://wizzard.dreamwidth.org/361458.html"/>
    <link rel="self" type="text/xml" href="https://wizzard.dreamwidth.org/data/atom/?itemid=361458"/>
    <title>Обобщение 3-way merge</title>
    <published>2014-03-21T15:23:42Z</published>
    <updated>2014-03-21T15:56:44Z</updated>
    <category term="dvcs"/>
    <category term="merge"/>
    <category term="crdt"/>
    <category term="ot"/>
    <category term="вопрос"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Допустим, у нас есть функция 3-way merge, которая из трех версий O[rigin], A, B однозначно&lt;sup&gt;1&lt;/sup&gt; делает версию C&lt;br /&gt;&lt;br /&gt;Как нетривиально&lt;sup&gt;2&lt;/sup&gt; обобщить эту функцию на такие случаи:&lt;br /&gt;&lt;br /&gt;1. есть R1 (предок) и 3 головы (Ra:R1, Rb:R1, Rc:R1)&lt;br /&gt;&lt;br /&gt;2. есть R1 (предок), Ra:R1, Rb:R1, и две головы (Rx:[Rb,Ra] и Rc:R1)&lt;br /&gt;&lt;br /&gt;Как-то так. Мне главное чтоб сохранилось свойство консистентности, т.е. чтобы "в итоге" все, получив все наборы ревизий, пришли без дополнительных коммуникаций к одинаковому исходу.&lt;br /&gt;&lt;br /&gt;Т.е. чтобы если ПОСЛЕ мержа примера (1) участники узнали что кто-то вбросил голову Ry:[Ra,Rb] то оно смержилось в то же самое, во что смержится пример (2)&lt;br /&gt;&lt;br /&gt;В терминах git/hg: мне надо чтобы после того как все один раз push --force, дождались когда пушнут все остальные и pull - автомерж выдал одинаковый результат&lt;br /&gt;&lt;br /&gt;В качестве дополнительной инфы у ревизии есть автор, все ревизии от одного автора упорядочены по времени "до/после", но время ревизий двух разных авторов сравнивать нельзя. Т.е. vector clock.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;1. т.е. merge(O,A,B) === merge(O,B,A), что достигнуто, например, лексикографическим упорядочиванием A, B по хэшу от их содержимого.&lt;br /&gt;НО мерж не коммутативен, т.е. m(A,m(B,C))!=m(m(A,B),C)&lt;br /&gt;2. решению задачи удовлетворяет тривиальная функция которая всегда возвращает null, но это, очевидно, не то)&lt;br /&gt;&lt;br /&gt;UPD: предложили посмотреть &lt;a href="http://en.wikipedia.org/wiki/C3_linearization"&gt;http://en.wikipedia.org/wiki/C3_linearization&lt;/a&gt; , &lt;a href="http://en.wikibooks.org/wiki/Understanding_Darcs/Patch_theory"&gt;http://en.wikibooks.org/wiki/Understanding_Darcs/Patch_theory&lt;/a&gt; , смотрю&lt;br /&gt;UPD2: да, я знаю про Operational Transformation и Commutative Replicated Data Types, это скорее второе.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=wizzard&amp;ditemid=361458" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-07:754492:251661</id>
    <link rel="alternate" type="text/html" href="https://wizzard.dreamwidth.org/251661.html"/>
    <link rel="self" type="text/xml" href="https://wizzard.dreamwidth.org/data/atom/?itemid=251661"/>
    <title>git vs mercurial</title>
    <published>2012-11-22T00:18:16Z</published>
    <updated>2012-11-22T00:20:39Z</updated>
    <category term="dvcs"/>
    <category term="программирование"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Накопился определенный опыт работы с одним и с другим.&lt;br /&gt;&lt;br /&gt;В общем:&lt;br /&gt;Git: it works, but you have to learn it, tune it and tweak it.&lt;br /&gt;&lt;br /&gt;Mercurial: it just works. you can tune it if you want, but it just works.&lt;br /&gt;&lt;br /&gt;Еще с гитом я успел повлетать в пачку неприятных моментов когда пуш/пулл тупо не проходили, или репозиторий корраптился. Хорошо, что есть reflog. &lt;br /&gt;&lt;br /&gt;Плюс, как показала практика, в меркуриал можно успешно засунуть TFS репозиторий с историей весом несколько Gb, и это не вызывает каких-то тормозов вообще. Очень, очень хорошо. Да, не факт что это нормальная ситуация, но легаси есть легаси, его не изменить.&lt;br /&gt;&lt;br /&gt;В гите такое же действие приходит к тому что эмм надо долго шаманить с настройками, прежде чем пройдут особо крупные коммиты. Можно? Можно. Удобно? Не очень.&lt;br /&gt;&lt;br /&gt;Хотя "непроходимость коммитов" случалась даже на мелких репозиториях, если делать рефакторинг.&lt;br /&gt;&lt;br /&gt;С меркуриалом "history is sacred". Кому-то это нравится, кому-то нет. Мне - нравится.&lt;br /&gt;&lt;br /&gt;Гит, напротив, должен быть приятен тем, кто подрабатывает в министерстве правды и правит коммиты задним числом.&lt;br /&gt;&lt;br /&gt;Итого, для себя для продакшена - меркуриал. Гит неплох, но отвлекает. Меркуриал - просто и естественно становится частью рабочего процесса. &lt;br /&gt;&lt;br /&gt;Плюс, "windows is a first-class citizen for mercurial". Hg Workbench на первый взгляд страшен, но уже через пару дней реально удобная тулза. Тестеров и джуниоров она тоже не пугает, что немаловажно.&lt;br /&gt;&lt;br /&gt;А, да. SVN остается для особо сикретне проектов, где важна необходимость ограничивать доступ с гранулярностью до папок и оправдан оверхед на неудобные мержи.&lt;br /&gt;&lt;br /&gt;Как-то вот так.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=wizzard&amp;ditemid=251661" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
