2010-11-17 8 views
8

Я использую Mercurial некоторое время, и есть один «факт», который дается много раз.Mercurial merge awesomeness - что мне не хватает?

Фактически, он ударил меня во время просмотра видео, сделанного Fogcreek вчера, this video: Fog Creek Kiln: Unlock the power of DVCS for your company, что, похоже, что-то, что не работает для меня здесь.

Примерно в 1:39 в этом видео и далее говорится, что в то время как другие системы контроля версий отслеживают изменения (например, моментальные снимки), DVCS, такие как изменения Mercurial треков (то есть, что произошло между моментальными снимками).

Это дает им преимущество при слиянии сценариев, а затем показывает пример. Если вы переместите функцию в одну ветвь и измените ту же функцию в другой ветке, Mercurial сможет ее слить.

И я видел это в другом месте, хотя сейчас я не могу найти прямых ссылок.

Это не работает для меня.


Edit: Это проблема по умолчанию "beyondcompare3" конфигурации слияния инструмент для TortoiseHg. Я добавил конфигурацию ниже в файл Mercurial.ini, и теперь он работает так, как ожидалось. Конечно, это будет выбивать на инструмент GUI, если он не может automerge, но теперь слияние описано в этом вопросе здесь работает без каких-либо подсказок и просто делает правильные вещи из коробки

[ui] 
merge = bc3 

[merge-tools] 
bc3.executable = C:\Program Files (x86)\Beyond Compare 3\bcomp.exe 
bc3.args = $local $other $base $output /automerge /reviewconflicts /closescript 
bc3.priority = 1 
bc3.premerge = True 
bc3.gui = True 

Чтобы проверить это, я совершил этот файл в хранилище:

void Main() 
{ 
    Function1(); 
    Function2(); 
} 

public void Function1() 
{ 
    Debug.WriteLine("Function 1"); 
    for (int index = 0; index < 10; index++) 
     Debug.WriteLine("f1: " + index); 
} 

public void Function2() 
{ 
    Debug.WriteLine("Function 1"); 
} 

Затем в двух параллельных ревизиях ветвящимся от этого, я сделал следующие два изменения:

  1. я переместил функцию Function1 в нижней части файла
  2. Я изменил сообщение внутри Function1

Затем я попытался объединить, и Mercurial дает мне окно слияния конфликта, пытаясь выяснить, что я сделал.

В основном, он пытается изменить текст в Function2, который теперь находится в позиции, в которой Function1 был до того, как он был перемещен.

Этого не должно было случиться!


Вот исходные файлы для воспроизведения мой пример:

Пакетный файл для производства хранилища:

@echo off 

setlocal 

if exist repo rd /s /q repo 
hg init repo 
cd repo 

copy ..\example1.linq example.linq 
hg commit -m "initial commit" --addremove --user "Bob" --date "2010-01-01 18:00:00" 

copy ..\example2.linq example.linq 
hg commit -m "moved function" --user "Bob" --date "2010-01-01 19:00:00" 

hg update 0 
copy ..\example3.linq example.linq 
hg commit -m "moved function" --user "Alice" --date "2010-01-01 20:00:00" 

В 3 версии файла, example1.linq, example2.linq и example3 .linq:

Пример1.LINQ:

<Query Kind="Program" /> 

void Main() 
{ 
    Function1(); 
    Function2(); 
} 

public void Function1() 
{ 
    Debug.WriteLine("Function 1"); 
    for (int index = 0; index < 10; index++) 
     Debug.WriteLine("f1: " + index); 
} 

public void Function2() 
{ 
    Debug.WriteLine("Function 1"); 
} 

Example2.linq:

<Query Kind="Program" /> 

void Main() 
{ 
    Function1(); 
    Function2(); 
} 

public void Function2() 
{ 
    Debug.WriteLine("Function 1"); 
} 

public void Function1() 
{ 
    Debug.WriteLine("Function 1"); 
    for (int index = 0; index < 10; index++) 
     Debug.WriteLine("f1: " + index); 
} 

Example3.linq:

<Query Kind="Program" /> 

void Main() 
{ 
    Function1(); 
    Function2(); 
} 

public void Function1() 
{ 
    Debug.WriteLine("Function 1b"); 
    for (int index = 0; index < 10; index++) 
     Debug.WriteLine("f1: " + index); 
} 

public void Function2() 
{ 
    Debug.WriteLine("Function 1"); 
} 

ответ

7

Ну, вы в настоящее время удара одну из ограничения, в основном, любой ток VCS (DVCS или нет, это не имеет значения).

Дело в том, что VCS в настоящее время является агностиком языка, основой его алгоритма слияния является текстовый diff. Это означает, что они ищут какие изменения и что связано с контекстом.
Важной частью здесь является контекст. Это не более чем некоторые строки до и после внесенных вами изменений.

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

В настоящее время я знаю только об одном инструменте разграничения, от msft, для XML, который пытается разобраться с семантикой вашего изменения, а не только его текстовым представлением.
Я также знаю, что ребята из PlasticSCM пытаются реализовать такую ​​функцию для некоторых основных языков, но это действительно место, где есть возможности для улучшения.

+1

На самом деле это проблема конфигурации. Я использую Beyond Compare как свой инструмент diff/merge, и, судя по всему, если я не настрою TortoiseHg/Mercurial на использование Beyond Compare * самостоятельно *, он не будет авторизовать конфликты, которые он может обрабатывать. После того, как я добавил необходимую конфигурацию, все будет работать так, как ожидалось. Я уточню свой вопрос. –

+0

Я понимаю проблему с отсутствием контекста, у меня есть тесное знание о том, как работают алгоритмы diff, реализовав немало для текстовых и двоичных данных, но этот конкретный сценарий, как говорили, снова и снова работает с DVCS ', поэтому я было просто интересно, почему это не так. –

+0

Ну, на самом деле, пример не о том, что один парень меняет одну функцию, а другой перемещает ее, но тот же парень делает две операции (в два этапа). Это означает, что теоретически вы должны были работать над Fonction2, в то время как кто-то другой выполнял бы две другие операции, а затем слияние будет работать хорошо. – gizmo

Смежные вопросы