GNU diff3 (трехстороннее слияние) дает неожиданный результат - PullRequest
2 голосов
/ 14 октября 2010

Предположим, что файлы MINE и YOURS являются потомками OLD.

FILE_MINE =

abc
def
ghi

FILE_OLD =

abc
jkl
ghi

FILE_YOURS =

abc
def
ghi

Команда diff3 -m MIND OLD YOURS дает:

abc
<<<<<<< OLD
jkl
=======
def
>>>>>>> YOURS
ghi

diff3 не может решить, что MINE и YOURS сделали одинаковые изменения.

Почему?И есть ли способ решить эту проблему?

Пощекотайте свой мозг следующим образом:

diff OLD MIND и diff OLD YOURS имеют одинаковые фрагменты в своем выводе.

2c2
< jkl
---
> def

Разве эти куски не должны "отменяться" во время трехстороннего слияния?

1 Ответ

2 голосов
/ 16 февраля 2011

Что вы ожидали получить?

Как говорится в статье , описывающей утилиту diff3 :

... Это (объединение) не может быть истинным , когда все три вводафайлы отличаются или , если отличаются только старые ;мы называем это конфликтом .Когда все три входных файла различаются, мы называем конфликт перекрытием

Поэтому описанный вами случай рассматривается как конфликт.'Почему так?'Вы можете спросить.Из-за алгоритма diff3.Описание вы можете найти на той же странице:

Вы можете думать об этом (объединении) как вычитание старшего из вашего и добавление результата к mine , или в результате слияния с моим изменения, которые превратят вас в старых

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

Я бы согласился с вами, если вы скажете, что это должно работать с использованием другого подхода.Но что есть, то есть.diff3 не идеален, я бы порекомендовал использовать другие инструменты, если вы хотите сделать это правильно, как описано в статье

...