Сравнение и объединение файлов diff, diff3, sdiff, cmp, patch : Слияние файлов имеющих общего предка

Вперед Назад Содержание

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'.


Вперед Назад Содержание