Подвижно всегда использование внешних инструментов слияния, когда два ответвления, которые объединяются, имеют изменения в том же файле?
Или это увидело в первый раз, если это может объединить сам файл, и только плывущий на плоскодонке к внешнему инструменту, если это не может?
Причина, которую я спрашиваю, состоит в том, что я (еще раз) перечитываю учебное руководство, записанное Joel Spolsky на Подвижном и одной вещи, которую он говорит при сравнении, как Подверсия и Подвижный объединяется, то, что:
В отличие от этого, в то время как мы работали отдельно в Подвижном, Подвижное было занято, сохранив серию changesets. И так, то, когда мы хотим объединить наш код вместе, Подвижный на самом деле, имеет намного больше информации: это знает то, что каждого из нас измененный и может повторно применить те изменения, вместо того, чтобы просто смотреть на конечный продукт и пытаться предположить, как соединить его.
Только, мой опыт говорит мне, что это, кажется, включает внешний инструмент слияния, когда два ответвления имеют изменения в тех же файлах. И таким образом, разве который не представляет вышеупомянутый неправильный аргумент?
Или если я интерпретирую это следующим образом:
Кто-то может пролить некоторый свет на это?
Править: Позвольте мне дать пример:
@echo off
setlocal
if exist repo rd /s /q repo
md repo
cd repo
hg init .
rem --- version 0 ---
echo 1 >test.txt
echo 2 >>test.txt
echo 3 >>test.txt
echo 4 >>test.txt
echo 5 >>test.txt
hg add test.txt
hg commit -m "v0"
rem --- version 1 ---
echo 1 >test.txt
echo 2 v1 >>test.txt
echo 3 >>test.txt
echo 4 >>test.txt
echo 5 >>test.txt
hg commit -m "v1"
rem --- version 2 ---
hg update 0
echo 1 >test.txt
echo 2 >>test.txt
echo 3 >>test.txt
echo 4 v2 >>test.txt
echo 5 >>test.txt
hg commit -m "v2"
rem --- merge ---
hg update 1
hg merge 2
Это сначала создает файл со следующим содержанием:
1
2
3
4
5
Затем это изменяет его на:
1
2 v1
3
4
5
Затем это возвращается к начальной версии (changeset) и изменяет его на:
1
2
3
4 v2
5
Затем это пытается объединить два.
Теперь, согласно (в настоящее время) единственному ответу, это не должно создавать проблему, так как изменения не находятся в конфликте.
Однако в этой точке, Вне всякого сравнения (мой внешний инструмент слияния) вызывается.
Mergetool вызывается только в случае конфликта, который необходимо разрешить. Изменения одного и того же файла в разных ветках являются таким конфликтом.
В остальном, алгоритм слияния не основан на наборах изменений, он основан на файлах, чтобы обеспечить наилучшие результаты слияния. Более подробную информацию см. в Mercurial Wiki.
Mercurial оставляет ваше слияние не завершенным, так что у вас есть возможность проверить свой код до внесения набора изменений слияния.
Большое различие между ртутным слиянием и слиянием svn состоит в том, что алгоритм ртутного слияния имеет доступ к последнему общему предку между двумя сливаемыми ревизиями. Если ваша история выглядит как
A--B
\-C
svn проиграет вашим инструментам слияния B и C. Mercurial запустит ваш инструмент с A, B и C, и некоторые инструменты с этим справятся лучше.
Mercurial действительно выполняет собственное внутреннее слияние перед запуском вашего инструмента, где он сам использует A, B и C, чтобы сделать некоторые из очевидных выборов. Вы можете отключить это, изменив настройку предварительного слияния
для инструмента.
Ваш тест не дает хороших результатов, потому что вы объединяете 2 с его собственным предком. Если вместо этого вы выполните hg update 0
перед созданием набора изменений 2, так что у вас будет фактическая история ветвления, подобная этой:
@ changeset: 2:790856e061f4
| tag: tip
| parent: 0:bfba1d8f77af
| user: Ry4an Brase
| date: Fri Jul 09 16:50:34 2010 -0500
| summary: added v2
|
| @ changeset: 1:7a9c581561b6
|/ user: Ry4an Brase
| date: Fri Jul 09 16:50:16 2010 -0500
| summary: added v1
|
o changeset: 0:bfba1d8f77af
user: Ry4an Brase
date: Fri Jul 09 16:49:29 2010 -0500
summary: first
, тогда, когда вы hg merge
, вы получите:
1
2 v1
3
4 v2
5
без запуска вашего инструмента слияния.