Я использую 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");
}
Затем в двух параллельных ревизиях ветвящимся от этого, я сделал следующие два изменения:
- я переместил функцию Function1 в нижней части файла
- Я изменил сообщение внутри 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");
}
На самом деле это проблема конфигурации. Я использую Beyond Compare как свой инструмент diff/merge, и, судя по всему, если я не настрою TortoiseHg/Mercurial на использование Beyond Compare * самостоятельно *, он не будет авторизовать конфликты, которые он может обрабатывать. После того, как я добавил необходимую конфигурацию, все будет работать так, как ожидалось. Я уточню свой вопрос. –
Я понимаю проблему с отсутствием контекста, у меня есть тесное знание о том, как работают алгоритмы diff, реализовав немало для текстовых и двоичных данных, но этот конкретный сценарий, как говорили, снова и снова работает с DVCS ', поэтому я было просто интересно, почему это не так. –
Ну, на самом деле, пример не о том, что один парень меняет одну функцию, а другой перемещает ее, но тот же парень делает две операции (в два этапа). Это означает, что теоретически вы должны были работать над Fonction2, в то время как кто-то другой выполнял бы две другие операции, а затем слияние будет работать хорошо. – gizmo