diff3 не может различить неконфликтующие изменения в последовательных строках
Пытаясь применить diff3 для объединения изменений в некоторых файлах, я заметил, что он не может автоматически объединять различия, возникающие в последовательных строках.
Чтобы проиллюстрировать это, предположим следующие три файла old, new1, new2:
старый:
строка 1 строка 2
new1:
строка 1 изменена строка 2
new2:
строка 1 строка 2 изменена
Ясно, что разные строки были изменены в new1 и new2, поэтому из этого следует, что изменения не являются конфликтующими. Теперь я хочу объединить изменения как из new1, так и из new2 относительно старого. Я ожидаю получить объединенный вывод с этим контентом:
строка 1 изменена строка 2 изменена
Тем не менее, запуск diff3 производит это:
$ diff3 -m new1 old new2
<<<<<<< new1
line 1 changed
line 2
||||||| old
line 1
line 2
=======
line 1
line 2 changed
>>>>>>> new2
Так что diff3 помечает изменения как конфликтующие. Очевидно, у него есть проблемы с распознаванием изменений, которые происходят в контексте других изменений. Чтобы проверить это предположение, я изменил мои примеры файлов, чтобы они содержали по три строки в каждой, и внес изменения в непоследовательные строки:
старый:
строка 1 строка 2 строка 3
new1:
строка 1 изменена строка 2 строка 3
new2:
строка 1 строка 2 строка 3 изменена
Запуск diff3:
$ diff3 -m new1 old new2
line 1 changed
line 2
line 3 changed
Ожидаемый объединенный результат произведен. Видимо, diff3 использует 2 строки контекста на изменение.
В отличие от diff, у diff3 нет опции командной строки для изменения количества строк контекста, поэтому у diff3, по-видимому, есть ограничение на невозможность обнаружить неконфликтующие изменения в последовательных строках текста. Это правильный вывод, и что я могу с этим сделать, если я хочу объединить изменения, как в первом примере выше? Поскольку мне приходится вносить изменения в несколько десятков файлов, возможно, более одного раза, я не хочу делать эти изменения вручную.
Для полноты: я использую diff3 (GNU diffutils) 3.6 в системе Ubuntu.