Всегда ли Mercurial использует внешние инструменты слияния, когда две объединяемые ветви имеют изменения в одном и том же файле?
Или он сначала видит, может ли он сам объединить файл, и только если он не может добавить его к внешнему инструменту?
Причина, по которой я спрашиваю, заключается в том, что я (еще раз) перечитываю учебник , написанный Джоэлем Спольски по Mercurial , и он говорит одну вещь, сравнивая, как Subversion и Mercurial объединяются, заключается в том, что :
В отличие от этого, пока мы работали отдельно в Mercurial, Mercurial занимался серией изменений. И поэтому, когда мы хотим объединить наш код, Mercurial на самом деле имеет гораздо больше информации: он знает, что каждый из нас изменил и может применить эти изменения, а не просто смотрит на конечный продукт и пытается угадать, как его поместить. вместе.
Только мой опыт подсказывает мне, что, по-видимому, задействуется внешний инструмент слияния, когда две ветви имеют изменения в одинаковых файлах. И поэтому, разве это не делает приведенный выше аргумент неверным?
Или мне следует интерпретировать это следующим образом:
- Subversion объединяет только конечное состояние двух ветвей и выполняет больше работы в одном модуле
- Mercurial объединяет каждый набор изменений по отдельности, что позволяет ему работать с меньшими единицами изменений, с более высокой вероятностью успеха объединения
Может кто-нибудь пролить свет на это?
Редактировать : Позвольте мне привести пример:
@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
Затем он пытается объединить два.
Теперь, согласно (в настоящее время) единственному ответу, это не должно создавать проблем, поскольку изменения не находятся в конфликте.
Однако на этом этапе запускается Beyond Compare (мой внешний инструмент слияния).