На этом графике есть три интересных ревизии, которые могут повлиять на (2) слияние:
- Teal changeset: не показан, но выглядит так, будто он чуть ниже графика. Это первый родитель (2)
- Синяя смена: номер пять снизу с надписью «Исправить тест». Это второй родитель (2).
- Общий предок родителей: также не показан, будет далее ниже. Как ни странно, похоже, что чередующийся чир может быть общим предком, но Mercurial теперь позволит вам сделать такое вырожденное слияние при нормальных обстоятельствах.
Когда Mercurial выполняет слияние, это только трех наборов изменений, которые имеют значение: две головы, которые вы объединяете, и их общий предок. В трехстороннем слиянии логика теперь такова:
ancestor parent1 parent2 => merge
X X Y Y (clean)
X Y X Y (clean)
X Y Y Y (clean)
X Y Z W (conflict)
Прочитайте таблицу следующим образом: «если предок был X
, а первый родитель был также X
, а второй родитель был Y
, то объединение будет содержать Y
». Другими словами: трехстороннее слияние способствует изменению и позволит выиграть модификацию.
Вы можете найти предка с помощью
$ hg log -r "ancestor(p1(changeset-2), p2(changeset-2))"
где changeset-2
- это тот, который отмечен (2) выше. Когда вы говорите
Файлы, зафиксированные в (1), возвращаются в предыдущее состояние в (2), даже если эти файлы не упоминаются в слиянии.
тогда важно понимать, что "слияние" - это просто снимок, который показывает, как смешать два других набора изменений. Изменение, сделанное «в» слиянии, представляет собой разницу между этим снимком и его двумя родительскими наборами изменений:
$ hg status --rev "p1(changeset-2):changeset-2"
$ hg status --rev "p2(changeset-2):changeset-2"
Это показывает, как набор изменений слияния отличается от своего первого и второго родителя соответственно. Я уверен, что файлы упоминаются в одном из этих списков - если слияние не является виновником в конце концов.
Когда вы изучите три набора изменений и различия между ними, вы, вероятно, увидите, что кто-то должен разрешить конфликт (четвертая строка в таблице слияния выше) и выбрал неправильный файл на каком-то этапе.