Подвижный и инструменты слияния?

Подвижно всегда использование внешних инструментов слияния, когда два ответвления, которые объединяются, имеют изменения в том же файле?

Или это увидело в первый раз, если это может объединить сам файл, и только плывущий на плоскодонке к внешнему инструменту, если это не может?

Причина, которую я спрашиваю, состоит в том, что я (еще раз) перечитываю учебное руководство, записанное Joel Spolsky на Подвижном и одной вещи, которую он говорит при сравнении, как Подверсия и Подвижный объединяется, то, что:

В отличие от этого, в то время как мы работали отдельно в Подвижном, Подвижное было занято, сохранив серию changesets. И так, то, когда мы хотим объединить наш код вместе, Подвижный на самом деле, имеет намного больше информации: это знает то, что каждого из нас измененный и может повторно применить те изменения, вместо того, чтобы просто смотреть на конечный продукт и пытаться предположить, как соединить его.

Только, мой опыт говорит мне, что это, кажется, включает внешний инструмент слияния, когда два ответвления имеют изменения в тех же файлах. И таким образом, разве который не представляет вышеупомянутый неправильный аргумент?

Или если я интерпретирую это следующим образом:

  • Подверсия только объединяет конечное состояние двух ответвлений и имеет больше работы, чтобы сделать в едином блоке
  • Подвижные слияния каждый changeset индивидуально, который позволяет этому работать с меньшими единицами изменений с более высокими шансами на успех слияния

Кто-то может пролить некоторый свет на это?


Править: Позвольте мне дать пример:

@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

Затем это пытается объединить два.

Теперь, согласно (в настоящее время) единственному ответу, это не должно создавать проблему, так как изменения не находятся в конфликте.

Однако в этой точке, Вне всякого сравнения (мой внешний инструмент слияния) вызывается.

8
задан Lasse V. Karlsen 9 July 2010 в 19:49
поделиться

2 ответа

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

В остальном, алгоритм слияния не основан на наборах изменений, он основан на файлах, чтобы обеспечить наилучшие результаты слияния. Более подробную информацию см. в Mercurial Wiki.

Mercurial оставляет ваше слияние не завершенным, так что у вас есть возможность проверить свой код до внесения набора изменений слияния.

3
ответ дан 5 December 2019 в 18:56
поделиться

Большое различие между ртутным слиянием и слиянием 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

без запуска вашего инструмента слияния.

6
ответ дан 5 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: