Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum
Беспроводные выключатели nooLite

Lines Club

Ищем достойных соперников.




Книги по Linux (с отзывами читателей)

Библиотека сайта или "Мой Linux Documentation Project"

Next Previous Contents

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


Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют