Библиотека сайта rus-linux.net
8. Слияние файлов имеющих общего предка
Когда два человека вносят изменения в копии одного и того же файла, 'diff3' может произвести объединенную версию этого файла, содержащую одновременно оба набора изменений, и предупреждая о конфликтах.
Можно легко представить программы с именами типа 'diff4' и 'diff5' для сравнения более, чем трех файлов одновременно, но на практике подобная необходимость возникает редко. Можно использовать 'diff3' для объединения трех или более наборов изменений внесенных в файл, путем объединения таких наборов по два.
'diff3' может объединять изменения в двух измененных версиях в общую предшествующую версию. Это позволяет объединять наборы изменений представленных двумя более новыми файлами. Задавайте общую версию-"предка" как второй аргумент и две более новых версии как первый и третий аргументы:
diff3 MINE OLDER YOURS
Нужный порядок аргументов легко запомнить, заметив что они
следуют в алфавитном порядке.
Вы можете представить процесс обработки, как вычитание OLDER из YOURS и прибавление результата к MINE, или как объединение в MINE изменений, которые переводят OLDER в YOURS. Это объединение хорошо определено, если MINE и OLDER совпадают в окрестности каждого такого изменения, напротив это не так, когда все три входных файла различаются или отличие имеется только в файле OLDER; мы называем это "конфликтом". Когда все три входных файла различаются, мы называем такой конфликт "перекрыванием".
'diff3' позволяет обращаться с перекрываниями и конфликтами несколькими способами. Можно пренебрегать перекрытиями и конфликтами, или выделять только перекрытия, или отмечать конфликты специальными строками '<<<<<<<' и '>>>>>>>'.
'diff3' может произвести объединенный результат как скрипт для 'ed', который может быть применен на первом файле, для получения единой версии. Однако, обычно предпочтительнее, чтобы 'diff3' генерировал объединенную версию непосредственно; что автоматически решает нкоторые проблемы связанные с 'ed'.
8.1 Выбор изменений для объединения
Можно выбрать все неслитые изменения OLDER от YOURS, для сливания с MINE с помощью опции '-e' или '--ed'. Можно выбрать только неперекрывающиеся неслитые изменения с помощью '-3' или '--easy-only', и выбрать только перекрывающиеся изменения с помощью '-x' или '--overlap-only'.
Опции '-e', '-3' и '-x' отделяют только "необъедененные изменения", т.е. изменения, где MINE и YOURS различаются; они игнорируют различия OLDER и YOURS, в которых MINE и YOURS совпадают, потому что они считают, что такие изменения уже объединены. Если это допущение не справедливо, можно использоывать опцию '-A' или '--show-all' (см. "Пометка конфликтов").
Далее приведен результат команды 'diff3', с каждой из этих трех опций (см. Третий образец входного файла::, для полного содержания файлов). Заметьте, что результат '-e' объединяет несвязанные наборы изменения из результатов '-3' и '-x'.
Результат работы 'diff3 -e lao tzu tao':
11a
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
.
8c
so we may see their result.
.
Результат работы `diff3 -3 lao tzu tao':
8c
so we may see their result.
.
Результат работы `diff3 -x lao tzu tao':
11a
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
.
8.2 Пометка конфликтов
'diff3' может отмечать конфликты в объединенном результате, заключая их в специальные отмечающие строки. Конфликт, который происходит между файлами A и B отмкчается так:
<<<<<<< A
lines from A
=======
lines from B
>>>>>>> B
Конфликт, происходящий между тремя файлами A, B и C, отмечается
так:
<<<<<<< A
lines from A
||||||| B
lines from B
=======
lines from C
>>>>>>> C
Опция '-A' или '--show-all' действует подобно опции '-e', за
исключением того, что она заключает конфликты в отмечающие строки и
выводит все изменения OLDER от YOURS, а не только необъединенные
изменения. Так, в данных образцами входных файлов (см. "Третий образец
входного файла"), команда 'diff3 -A lao tzu tao' ставит выделяющие
строки вокруг конфликтов, там где различается только 'tzu':
<<<<<<< tzu
=======
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
>>>>>>> tao
и выводит тринаправленный конфликт так:
<<<<<<< lao
||||||| tzu
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
=======
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao
Опция '-E' или '--show-overlap' выводит меньше информации, чем
опция '-A' или '--show-all', потому что ее результаты включают только
необъединенные изменения, и она никогда не показывает содержимого
второго файла. Таким образом, опция '-E' действует подобно опции '-e',
за исключением того, что она заключает в отмечающие строки первый и
третий файл в тринаправленных перекрывающихся изменениях. Подобным
образом, '-X' отличается от '-x', за исключением того, что '-X'
выделяет отмечающими строками все такие (обязательно перекрывающиеся)
изменения. Например, на описанное выше тринаправленное различие, '-E'
и '-X' реагируют одинаково:
<<<<<<< lao
=======
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao
При сравнивании файлов, имеющих малоосмысленные или
неинформативные имена, можно использовать опцию '-L LABEL' или
'--label=LABEL', для отображения альтернативных имен в отмечающих
строках '<<<<<<<', '|||||||' и '>>>>>>>'. Эта опция может быть задана
три раза, по одному для каждого входного файла. Так, 'diff3 -A -L X -L
Y -L Z A B C' действует как 'diff3 -A A B C', за исключением того, что
результаты работы будут выглядеть так, будто обрабатывались файлы с
именами 'X', 'Y', 'Z', а не 'A', 'B' и 'C'.
8.3 Генерирование объединенного результата непосредственно
С помощью опции '-m' или '--merge', 'diff3' производит объединенный файл непосредственно. Это более эффективно, чем использование для этой цели 'ed', и работает даже с нетекстовыми файлами, с которыми 'ed' не работает. Если задать опцию '-m' без опции 'ed'-скрипта, по умолчанию задается опция '-A' ('--show-all').
Например, команда 'diff3 -m lao tzu tao' (см. "Третий образец входного файла" для копий входных файлов) даст следующие результаты:
<<<<<<< tzu
=======
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
>>>>>>> tao
The Nameless is the origin of Heaven and Earth;
The Named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their result.
The two are the same,
But after they are produced,
they have different names.
<<<<<<< lao
||||||| tzu
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
=======
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao
8.4 Как 'diff3' объединяет неполные строки
С опцией '-m' неполные строки (см. "Неполные строки") просто копируются в результат так, как они были найдены; если объединенный результат заканчивается на конфликте, и один из входных файлов заканчивается на неполной строке, следующие выделяющие строки ('|||||||', '=======' или '>>>>>>>') появятся не в начале строки, а в другом месте, так как они будут добавлены к неполной строке.
Без опции '-m', если задана опция 'ed' скрипта и найдена неполная строка, 'diff3' генерирует предупреждение и действует так как если бы в этом месте был символ новой строки.
8.5 Сохранение измененных файлов
'diff3' в традиционном Unix генерирует 'ed' скрипт без добавления команд 'w' и 'q', сохраняющих изменения. Версия 'diff3' в версии System V генерирует эти дополнительные команды. GNU 'diff3' обычно ведет себя себя подобно 'diff3' в традиционном Unix, но с опцией '-i' он будет действовать как 'diff3' System V и добавлять команды 'w' и 'q'.
Опция '-i' требует одной из опций 'ed' скрипта '-AeExX3' и несовместима с опцией объединенного вывода '-m'.
Next Previous Contents