stringtranslate.com

разница

В вычислительной технике утилита diff — это инструмент сравнения данных , который вычисляет и отображает различия между содержимым файлов. В отличие от понятия расстояния редактирования , используемого для других целей, diff ориентирован на строки, а не на символы, но он похож на расстояние Левенштейна в том, что он пытается определить наименьший набор удалений и вставок для создания одного файла из другого. Утилита отображает изменения в одном из нескольких стандартных форматов, так что как люди, так и компьютеры могут анализировать изменения и использовать их для внесения исправлений .

Обычно diff используется для отображения изменений между двумя версиями одного и того же файла. Современные реализации также поддерживают двоичные файлы . [1] Выходные данные называются «diff» или « патчем» , поскольку выходные данные могут быть применены с помощью «патча» программы Unix . Вывод подобных утилит сравнения файлов также называется «diff»; Подобно использованию слова « grep » для описания процесса поиска, слово « diff» стало общим термином для расчета разницы данных и их результатов. [2] Стандарт POSIX определяет поведение утилит «diff» и «patch» и их форматы файлов. [3]

История

diff был разработан в начале 1970-х годов для операционной системы Unix, которая возникла в Bell Labs в Мюррей-Хилл, штат Нью-Джерси. Она была частью 5-го издания Unix, выпущенного в 1974 году [4] и была написана Дугласом Макилроем и Джеймсом Хантом . Это исследование было опубликовано в статье 1976 года, написанной в соавторстве с Джеймсом У. Хантом, который разработал первоначальный прототип diff . [5] Алгоритм, описанный в этой статье, стал известен как алгоритм Ханта – Шиманского .

Работе Макилроя предшествовали и оказали на нее влияние программа сравнения Стива Джонсона по GECOS и программа доказательств Майка Леска . Доказательство также возникло в Unix и, как и diff , производило построчные изменения и даже использовало угловые скобки («>» и «<») для представления вставки и удаления строк в выводе программы. Однако эвристика , использованная в этих ранних приложениях, была сочтена ненадежной. Потенциальная полезность инструмента сравнения побудила Макилроя исследовать и разработать более надежный инструмент, который можно было бы использовать в различных задачах, но который хорошо справлялся бы с ограничениями по обработке и размеру аппаратного обеспечения PDP-11 . Его подход к проблеме стал результатом сотрудничества с людьми из Bell Labs, включая Альфреда Ахо , Эллиота Пинсона, Джеффри Уллмана и Гарольда С. Стоуна.

В контексте Unix использование редактора строк ed предоставило diff естественную возможность создавать пригодные для использования на компьютере «сценарии редактирования». Эти сценарии редактирования, сохраненные в файле, могут быть вместе с исходным файлом полностью восстановлены путем редактирования в модифицированный файл. Это значительно уменьшило объем вторичной памяти , необходимой для поддержки нескольких версий файла. Макилрой рассматривал возможность написания постпроцессора для diff , в котором можно было бы спроектировать и реализовать различные форматы вывода, но он нашел более экономным и простым, чтобы diff отвечал за генерацию синтаксиса и входных данных в обратном порядке, принимаемых командой ed .

В 1984 году Ларри Уолл создал отдельную утилиту patch , опубликовав ее исходный код в группах новостей mod.sources и net.sources . [6] [7] [8] Эта программа изменяет файлы, используя выходные данные diff , и имеет возможность сопоставлять контекст.

Руководство по переносимости X/Open, выпуск 2, 1987 г., включает в себя различия. Контекстный режим был добавлен в POSIX.1-2001 (выпуск 6). Унифицированный режим был добавлен в POSIX.1-2008 (выпуск 7). [9]

В первые годы существования diff обычное использование включало сравнение изменений в исходном коде программного обеспечения и разметке технических документов, проверку результатов отладки программы, сравнение списков файловых систем и анализ ассемблерного кода компьютера. Выходные данные, предназначенные для ed, были призваны обеспечить сжатие последовательности изменений, внесенных в файл. [ нужна цитация ] Система контроля исходного кода (SCCS) и ее способность архивировать версии появились в конце 1970-х годов как следствие хранения сценариев редактирования из diff .

Алгоритм

Работа diff основана на решении задачи о самой длинной общей подпоследовательности . [5]

В этой задаче даны две последовательности пунктов:

а  б  в  d  ж  г ч j q z
а  б  в  г е ж  г я j krxy z

и мы хотим найти самую длинную последовательность элементов, которая присутствует в обеих исходных последовательностях в одном и том же порядке. То есть мы хотим найти новую последовательность, которую можно получить из первой исходной последовательности, удалив некоторые элементы, и из второй исходной последовательности, удалив другие элементы. Мы также хотим, чтобы эта последовательность была как можно более длинной. В данном случае это

abcdfgjz

Из самой длинной общей подпоследовательности достаточно сделать небольшой шаг, чтобы получить вывод, подобный diff : если элемент отсутствует в подпоследовательности, но присутствует в первой исходной последовательности, он должен быть удален (на что указывают знаки «-» ниже). ). Если он отсутствует в подпоследовательности, но присутствует во второй исходной последовательности, он должен быть вставлен (на что указывают знаки «+»).

эхиккркси+ - + - + + + +

Применение

Команда diffвызывается из командной строки, передавая ей имена двух файлов: . Вывод команды представляет изменения, необходимые для преобразования исходного файла в новый файл.diff original new

Если исходный и новый являются каталогами, то diff будет выполняться для каждого файла, существующего в обоих каталогах. Опция , будет рекурсивно спускаться по всем совпадающим подкаталогам для сравнения файлов между каталогами.-r

В любом из примеров в статье используются следующие два файла, исходный и новый :

В этом традиционном формате выводааозначает добавленный ,ддля удаленных исдля измененного . Номера строк исходного файла появляются переда/д/си элементы нового файла появятся позже. Знаки « меньше » и «больше» (в начале добавленных, удаленных или измененных строк) указывают, в каком файле появляются строки. Дополнительные строки добавляются в исходный файл и появляются в новом файле. Строки удаления удаляются из исходного файла и отсутствуют в новом файле.

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

Варианты вывода

Редактировать сценарий

Сценарий ed все еще может быть создан современными версиями diff с этой -eопцией. Результирующий сценарий редактирования для этого примера выглядит следующим образом:

24 аЭтот параграф содержит важные новые дополнения к данному документу..17 c проверьте этот документ. На.11,15 д
0 а Это важное замечание! Поэтому он должен быть расположен в начале этого документа!.

Чтобы преобразовать содержимое исходного файла в содержимое нового файла с помощью ed , мы должны добавить две строки в этот файл различий: одну строку, содержащую команду (записи), а другую, содержащую команду (завершения) (например, by ​​). Здесь мы дали файлу различий имя mydiff , и преобразование произойдет при запуске .wqprintf "w\nq\n" >> mydiffed -s original < mydiff

Формат контекста

В дистрибутиве Unix в Беркли особое внимание уделялось добавлению формата контекста ( -c) и возможности рекурсивного обращения к структурам каталогов файловой системы ( -r), добавив эти функции в версию 2.8 BSD, выпущенную в июле 1981 года. Контекстный формат diff, представленный в Беркли, помог при распространении патчи для исходного кода, которые могли быть изменены минимально.

В контекстном формате любые измененные строки отображаются рядом с неизмененными строками до и после. Включение любого количества неизмененных строк обеспечивает контекст патча. Контекст состоит из строк, которые не изменились между двумя файлами , и служат ссылкой для определения места строк в измененном файле и поиска предполагаемого места для применения изменения, независимо от того, совпадают ли номера строк. Контекстный формат обеспечивает большую читабельность для людей и надежность при применении исправления, а выходные данные принимаются в качестве входных данных для программы исправления . Такое разумное поведение невозможно при использовании традиционного вывода diff.

Количество неизмененных строк, отображаемых над и под фрагментом изменения , может быть определено пользователем, даже равно нулю, но обычно по умолчанию используются три строки. Если контекст неизмененных строк в фрагменте перекрывается с соседним фрагментом, то diff позволит избежать дублирования неизмененных строк и объединить фрагменты в один фрагмент.

« !» представляет собой изменение между строками, которые соответствуют в двух файлах, тогда как « +» представляет собой добавление строки, а « -» - удаление строки. Пустое пространство представляет собой неизмененную строку. В начале патча содержится информация о файле, включая полный путь и отметку времени , разделенную символом табуляции. В начале каждого фрагмента указаны номера строк, соответствующие соответствующим изменениям в файлах. Диапазон чисел, отображаемый между наборами из трех звездочек, относится к исходному файлу, а набор из трех тире — к новому файлу. Диапазоны фрагментов указывают номера начальной и конечной строк в соответствующем файле.

Команда diff -c original newвыдает следующий результат:

*** /путь/к/исходной метке времени --- /путь/к/новой метке времени****************** 1,3 ****--- 1,9 ---- + Это важное + примечание! Поэтому он должен + находиться в + начале этого + документа! +  Эта часть документа  осталась неизменной  от версии к****************** 8,20 **** сжать размер изменений  .- Этот абзац содержит - текст, который устарел. - Оно будет удалено в ближайшем будущем. Важно писать ! проверьте этот документ. С  другой стороны,  слово с ошибкой — это не  конец света. --- 14,21 ----  сжать размер изменений  . Важно писать ! проверьте этот документ. С  другой стороны,  слово с ошибкой — это не  конец света.****************** 22,24 ****--- 23,29 ----  этот абзац надо  изменить. После этого можно что-то  добавить. + + Этот параграф содержит + важные новые дополнения + к данному документу.

информация Примечание. Здесь выходные данные различий показаны цветами, чтобы их было легче читать. Утилита diff не выдает цветной результат; его вывод представляет собой обычный текст . Однако многие инструменты могут отображать выходные данные цветами, используя подсветку синтаксиса .

Единый формат

Унифицированный формат (или unidiff ) [11] [12] наследует технические улучшения, внесенные в контекстный формат, но создает меньшие различия со старым и новым текстом, представленными непосредственно рядом. Унифицированный формат обычно вызывается с помощью параметра командной строки-u " " . Этот вывод часто используется в качестве входных данных для программы исправления . Многие проекты специально требуют, чтобы «разности» представлялись в едином формате, что делает единый формат различий наиболее распространенным форматом для обмена между разработчиками программного обеспечения.

Унифицированные контекстные различия были первоначально разработаны Уэйном Дэвисоном в августе 1990 года (в формате unidiff , который появился в 14 томе comp.sources.misc). Месяц спустя Ричард Столлман добавил унифицированную поддержку различий в утилиту diff проекта GNU , и эта функция дебютировала в версии GNU diff 1.15, выпущенной в январе 1991 года. С тех пор GNU diff обобщил формат контекста, чтобы разрешить произвольное форматирование различий.

Формат начинается с того же двухстрочного заголовка, что и формат контекста, за исключением того, что исходному файлу предшествует "---" и новому файлу предшествует "+++". После этого идут один или несколько фрагментов изменений , которые содержат различия строк в файле. Неизмененным контекстным строкам предшествует символ пробела, строкам добавления предшествует знак плюс , а строкам удаления - знак минус .

Чанк начинается с информации о диапазоне , за которым сразу же следует добавление строк, удаление строк и любое количество контекстных строк. Информация о диапазоне окружена двойным знаком at и объединяет в одну строку то, что отображается в двух строках в контекстном формате (выше). Формат строки информации о диапазоне следующий:

@@ -l,s +l,s @@ необязательный заголовок раздела

Информация о диапазоне фрагментов содержит два диапазона фрагментов. Диапазону фрагмента исходного файла предшествует символ минус, а диапазону нового файла — символ плюс. Каждый диапазон фрагментов имеет формат l,s, где l — номер начальной строки, а s — количество строк, к которым применяется фрагмент изменения для каждого соответствующего файла. Во многих версиях GNU diff в каждом диапазоне можно опускать запятую и завершающее значение s , в этом случае s по умолчанию равно 1. Обратите внимание, что единственное действительно интересное значение — это номер строки l первого диапазона; все остальные значения могут быть вычислены из разницы.

Диапазон фрагментов для оригинала должен представлять собой сумму всех контекстных и удаленных (включая измененные) фрагментов. Диапазон фрагментов для нового файла должен представлять собой сумму всех контекстных и дополнительных (в том числе измененных) строк фрагментов. Если информация о размере фрагмента не соответствует количеству строк в фрагменте, то разницу можно считать недействительной и отклонить.

При желании за диапазоном фрагментов может следовать заголовок раздела или функции, частью которого является фрагмент. В основном это полезно для облегчения чтения различий. При создании различий с помощью GNU diff заголовок идентифицируется путем сопоставления с регулярным выражением . [13]

Если строка изменена, это представляется как удаление и добавление. Поскольку фрагменты исходного и нового файла находятся в одном фрагменте, такие изменения будут отображаться рядом друг с другом. [14] В приведенном ниже примере это происходит так:

-проверьте этот документ. На+проверьте этот документ. На

Команда diff -u original newвыдает следующий результат:

--- /путь/к/исходной метке времени +++ /путь/к/новой метке времени @@ -1,3 +1,9 @@ +Это важное +уведомление! Поэтому он должен находиться в +начале этого +документа! +  Эта часть документа  осталась  неизменной от версии до @@ -8,13 +14,8 @@  сжать размер изменений  .-Этот абзац содержит устаревший текст. -В ближайшем будущем оно будет удалено . -  Важно правильно писать - проверьте этот документ. На +проверьте этот документ. С  другой стороны,  слово с ошибкой — это не  конец света. @@ -22,3 +23,7 @@  этот абзац необходимо  изменить. После этого можно что-то  добавить. + +Этот параграф содержит +важные новые дополнения +к этому документу.

информация Примечание. Здесь выходные данные различий показаны цветами, чтобы их было легче читать. Утилита diff не выдает цветной результат; его вывод представляет собой обычный текст . Однако многие инструменты могут отображать выходные данные цветами, используя подсветку синтаксиса .

Обратите внимание: чтобы успешно отделить имена файлов от меток времени, разделителем между ними является символ табуляции. Это невидимо на экране и может быть потеряно при копировании/вставке различий с экранов консоли/терминала.

Расширения

Существуют некоторые модификации и расширения форматов различий, которые используются и понимаются определенными программами и в определенных контекстах. Например, некоторые системы контроля версий , такие как Subversion , указывают номер версии, «рабочую копию» или любой другой комментарий вместо или в дополнение к метке времени в разделе заголовка различий.

Некоторые инструменты позволяют объединять различия нескольких разных файлов в один, используя заголовок для каждого измененного файла, который может выглядеть примерно так:

Индекс: путь/к/file.cpp

Особый случай файлов, которые не заканчиваются новой строкой, не обрабатывается. Ни утилита unidiff, ни стандарт POSIX diff не определяют способ обработки файлов этого типа. (Действительно, такие файлы не являются «текстовыми» файлами согласно строгим определениям POSIX. [15] ) GNU diff и git выдают «\ Нет новой строки в конце файла» (или переведенную версию) в качестве диагностики, но такое поведение непереносимо. . [16] Патч GNU, похоже, не обрабатывает этот случай, в то время как git-apply справляется. [17]

Программа исправлений не обязательно распознает выходные данные различий, специфичные для конкретной реализации. Однако известно, что патч GNU распознает патчи git и действует немного по-другому. [18]

Реализации и сопутствующие программы

Изменения, произошедшие с 1975 года, включают улучшения основного алгоритма, добавление полезных функций к команде и разработку новых форматов вывода. Базовый алгоритм описан в статьях Юджина Майерса « Разностный алгоритм O(ND) и его вариации» [19] и в книге Уэбба Миллера и Майерса « Программа сравнения файлов» . [20] Алгоритм был независимо обнаружен и описан в книге «Алгоритмы приблизительного сопоставления строк » ​​Эско Укконена . [21] Первые версии программы diff были разработаны для сравнения строк текстовых файлов, ожидая, что символ новой строки будет разделять строки. К 1980-м годам поддержка двоичных файлов привела к изменению дизайна и реализации приложений.

GNU diff и diff3 включены в пакет diffutils вместе с другими утилитами, связанными с различиями и исправлениями . [22]

Форматеры и интерфейсы

Постпроцессоры sdiff и diffmk отображают параллельные списки различий и применяют метки изменений к печатным документам соответственно. Оба были разработаны где - то в Bell Labs в 1981 году или ранее .

Diff3 сравнивает один файл с двумя другими файлами путем согласования двух различий. Первоначально он был задуман Полом Дженсеном для согласования изменений, внесенных двумя людьми, редактирующими общий источник. Он также используется системами контроля версий, например RCS , для слияния . [23]

В Emacs есть Ediff для отображения изменений, которые патч внесет в пользовательский интерфейс, который сочетает в себе возможности интерактивного редактирования и объединения файлов патчей.

Vim предоставляет vimdiff для сравнения от двух до восьми файлов, причем различия выделяются цветом. [24] Исторически сложилось так, что современный vim вызывает программу diff и использует git fork кода библиотеки xdiff (LibXDiff), обеспечивая повышенную скорость и функциональность. [25]

GNU Wdiff [26] — это интерфейс для сравнения, который показывает слова или фразы, которые изменились в текстовом документе письменного языка, даже при наличии переноса слов или различной ширины столбцов.

colordiff — это Perl-оболочка для diff, которая выдает тот же результат, но с раскраской добавленных и удаленных битов. [27] diff-so-fancy и diff-highlight — более новые аналоги. [28] «дельта» — это переписанная версия Rust, которая одновременно выделяет изменения и основной код. [29]

Patchutils содержит инструменты, которые объединяют, переупорядочивают, сравнивают и исправляют контекстные и унифицированные различия. [30]

Алгоритмические производные

Утилиты, сравнивающие исходные файлы по их синтаксической структуре, были созданы в основном как инструменты исследования некоторых языков программирования; [31] [32] [33] некоторые из них доступны в качестве коммерческих инструментов. [34] [35] Кроме того, к бесплатным инструментам, выполняющим различия с учетом синтаксиса, относятся:

spiff — это вариант diff , который игнорирует различия в вычислениях с плавающей запятой с ошибками округления и пробелами , которые обычно не имеют отношения к сравнению исходного кода. Bellcore написала оригинальную версию. [41] [42] Порт HPUX — это самая последняя общедоступная версия. spiff не поддерживает двоичные файлы. spiff выводит на стандартный вывод в стандартном формате diff и принимает входные данные на языках программирования C , Bourne Shell , Fortran , Modula-2 и Lisp . [43] [44] [41] [45] [42]

LibXDiff — это библиотека LGPL , которая обеспечивает интерфейс для многих алгоритмов с 1998 года. Первоначально был реализован улучшенный алгоритм Майерса с отпечатком Рабина (по состоянию на финальную версию 2008 года) [46] , но с тех пор git и ветвь libgit2 расширили репозиторий. со многими своими. Один алгоритм, называемый «гистограммой», обычно считается намного лучшим, чем исходный алгоритм Майерса, как по скорости, так и по качеству. [47] [48] Это современная версия LibXDiff, используемая Vim. [25]

Смотрите также

Другие бесплатные инструменты сравнения файлов

Рекомендации

  1. ^ Маккензи и др. «Двоичные файлы и принудительное сравнение текста» в книге « Сравнение и объединение файлов с помощью GNU Diff and Patch» . Загружено 28 апреля 2007 г. [1] Архивировано 19 декабря 2017 г. на Wayback Machine.
  2. ^ Эрик С. Рэймонд (редактор), «diff». Архивировано 31 января 2014 г. в Wayback Machine , The Jargon File , версия 4.4.7.
  3. ^ Компьютерное общество IEEE ; Открытая группа (26 сентября 2008 г.). Стандарт информационных технологий — базовые спецификации интерфейса портативной операционной системы (POSIX), выпуск 7 . стр. 2599–2607.Стандарт IEEE. 1003.1-2001 определяет традиционные форматы вывода «ed script» и контекстного сравнения; Стандарт IEEE. 1003.1-2008 добавил (к тому времени более распространенный) унифицированный формат.
  4. ^ https://minnie.tuhs.org/cgi-bin/utree.pl?file=V5/usr/source/s1/diff1.c
  5. ^ аб Джеймс В. Хант; М. Дуглас Макилрой (июнь 1976 г.). «Алгоритм дифференциального сравнения файлов» (PDF) . Технический отчет по вычислительной технике, Bell Laboratories . 41 . Архивировано (PDF) из оригинала 26 декабря 2014 г. Проверено 6 мая 2015 г.
  6. Ларри Уолл (9 ноября 1984 г.). «Аппликатор патчей — ВЫ ЭТОГО ХОТИТЕ!!!». Группа новостей : net.sources. Usenet:  [email protected]. Архивировано из оригинала 19 февраля 2022 года . Проверено 11 мая 2015 г.
  7. Ларри Уолл (29 ноября 1984 г.). «Патч версии 1.2 — ВЫ ЭТОГО ХОТИТЕ». Группа новостей : net.sources. Usenet:  [email protected]. Архивировано из оригинала 21 марта 2020 года . Проверено 11 мая 2015 г.
  8. Ларри Уолл (8 мая 1985 г.). «патч версии 1.3». Группа новостей : net.sources. Usenet:  [email protected]. Архивировано из оригинала 19 февраля 2022 года . Проверено 11 мая 2015 г.
  9. ^ diff  - Справочник по оболочке и утилитам, Единая спецификация UNIX , версия 4 от Open Group
  10. ^ Дэвид Маккензи; Пол Эггерт; Ричард Столлман (1997). Сравнение и объединение файлов с помощью GNU Diff и Patch. Бристоль: Теория сетей. ISBN 978-0-9541617-5-0. Архивировано из оригинала 31 марта 2015 г. Проверено 17 марта 2015 г.
  11. ^ «Подробное описание единого формата» . GNU Diffutils (версия 3.7, 7 января 2018 г.) . Архивировано из оригинала 18 января 2020 года . Проверено 29 января 2020 г.
  12. ^ ван Россум, Гвидо. «Единый формат различий». Все вещи Pythonic . Архивировано из оригинала 25 декабря 2019 г. Проверено 29 января 2020 г.
  13. ^ 2.2.3. Показ разделов, в которых имеются различия, руководство GNU diffutils
  14. Единый формат различий, автор: Гвидо ван Россум , 14 июня 2006 г.
  15. ^ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403. Архивировано 29 апреля 2013 г. в разделе 3.206 Wayback Machine .
  16. ^ «Неполные строки (сравнение и объединение файлов)» . www.gnu.org .
  17. ^ "git: apply.c". Гит. 8 мая 2023 г.
  18. ^ "patch.c\src - patch.git - патч GNU" . git.savannah.gnu.org . В различиях в стиле git состояние «до» каждого патча относится к начальному состоянию перед изменением каких-либо файлов.
  19. ^ Э. Майерс (1986). «Алгоритм разности O (ND) и его варианты». Алгоритмика . 1 (2): 251–266. CiteSeerX 10.1.1.4.6927 . дои : 10.1007/BF01840446. S2CID  6996809. 
  20. ^ Уэбб Миллер; Юджин В. Майерс (1985). «Программа сравнения файлов». Программное обеспечение: практика и опыт . 15 (11): 1025–1040. CiteSeerX 10.1.1.189.70 . дои : 10.1002/сп.4380151102. S2CID  15489614. 
  21. ^ Эско Укконен (1985). «Алгоритмы приблизительного сопоставления строк». Информация и контроль . 64 (1–3): 100–118. дои : 10.1016/S0019-9958(85)80046-2 .
  22. ^ Утилиты GNU Diff. Архивировано 16 марта 2015 г. на Wayback Machine . Доступно Фондом свободного программного обеспечения . Бесплатная документация. Бесплатный исходный код.
  23. ^ «Слияние (GNU RCS 5.10.0)». gnu.org . Архивировано из оригинала 18 сентября 2019 года . Проверено 22 января 2021 г.
  24. ^ Муленаар, Брэм . «Документация Vim: разница». vimdoc.sourceforge.net . Архивировано из оригинала 16 февраля 2020 года . Проверено 1 мая 2020 г. Самый простой способ начать редактирование в режиме сравнения — с помощью команды «vimdiff». При этом Vim запускается как обычно, а дополнительно настраивается на просмотр различий между аргументами. Это эквивалентно:vimdiff file1 file2 [file3] [file4] [...file8]vim -d file1 file2 [file3] [file4] [...file8]
  25. ^ Аб Брабандт, Кристиан (1 декабря 2018 г.). «Сила различия». Вимвейс . Архивировано из оригинала 2 декабря 2018 года . Проверено 1 мая 2020 г.
  26. ^ "gnu.org". www.gnu.org . Архивировано из оригинала 11 августа 2020 г. Проверено 12 сентября 2020 г.
  27. Ссылки www.colordiff.org . Архивировано из оригинала 14 июня 2018 г. Проверено 14 июня 2018 г.
  28. ^ "Такая необычная разница" . Так необычно. 6 мая 2023 г.
  29. Дэвисон, Дэн (8 мая 2023 г.). «дандависон/дельта». Гитхаб .
  30. Во, Тим (12 июня 2020 г.). «twaugh/patchutils». Гитхаб . Архивировано из оригинала 1 октября 2020 года . Проверено 28 июня 2020 г.
  31. ^ Хорвиц, Сьюзен (июнь 1990 г.). «Выявление семантических и текстовых различий между двумя версиями программы». Уведомления ACM SIGPLAN . 25 (6): 234–245. CiteSeerX 10.1.1.49.3377 . дои : 10.1145/93548.93574. Архивировано из оригинала 12 июня 2010 г. Проверено 1 ноября 2017 г. 
  32. ^ Ян, Ву (июль 1991 г.). «Определение синтаксических различий между двумя программами». Программное обеспечение: практика и опыт . 21 (7): 739–755. CiteSeerX 10.1.1.13.9377 . дои : 10.1002/сп.4380210706. S2CID  10853673. 
  33. ^ Трава. Cdiff: синтаксис, ориентированный на Diff для программ C++. Материалы конференции USENIX C++, стр. 181–193, 1992 г.
  34. ^ Compare++, http://www.coodesoft.com/. Архивировано 29 ноября 2011 г. на Wayback Machine.
  35. ^ SmartDifferencer, http://www.semanticdesigns.com/Products/SmartDifferencer. Архивировано 14 октября 2009 г. в Wayback Machine.
  36. ^ "Хайзек/зографоскоп" . Гитхаб . 26 мая 2020 г. Архивировано из оригинала 21 декабря 2020 г. Проверено 27 июня 2020 г.
  37. ^ DaisyDiff , https://code.google.com/p/daisydiff/. Архивировано 19 марта 2015 г. в Wayback Machine.
  38. ^ xmldiffpatch , http://msdn.microsoft.com/en-us/library/aa302294.aspx. Архивировано 27 октября 2009 г. на Wayback Machine.
  39. ^ xmldiffmerge , http://www.alphaworks.ibm.com/tech/xmldiffmerge. Архивировано 24 сентября 2009 г. на Wayback Machine.
  40. ^ Чейни, Остин. Pretty Diff — Документация . http://prettydiff.com/documentation.php. Архивировано 31 июля 2012 г. в Wayback Machine.
  41. ^ ab dontcallmedotcom. "спиф". Гитхаб . Архивировано из оригинала 26 марта 2015 г. Проверено 16 июня 2013 г.
  42. ^ Аб Нахбар, Дэниел В. (1 декабря 1999 г.). «Портирование и архивирование HP-UX». ВЕЛИКОБРИТАНИЯ. Архивировано из оригинала 5 сентября 2012 г. Проверено 13 июня 2013 г.
  43. ^ "СПИФФ 1" . 2 февраля 1988 г. Архивировано из оригинала 2 октября 2016 г. Проверено 16 июня 2013 г.
  44. ^ Нахбар, Дэниел В. (2 февраля 1988 г.). «Страница руководства». ВЕЛИКОБРИТАНИЯ. Архивировано из оригинала 10 сентября 2012 г. Проверено 16 июня 2013 г.
  45. ^ Давиде (28 сентября 2009 г.). "переполнение стека". Архивировано из оригинала 19 февраля 2022 г. Проверено 16 июня 2013 г.
  46. ^ Либензи, Давиде. «LibXDiff». SourceForge FreshMeat . Архивировано из оригинала 1 июля 2020 г. Проверено 28 июня 2020 г.
  47. ^ Нугрохо, Юсуф Сулистё; Хата, Хидеаки; Мацумото, Кеничи (январь 2020 г.). «Насколько различаются разные алгоритмы сравнения в Git?: Используйте --histogram для изменений кода». Эмпирическая разработка программного обеспечения : 790–823. arXiv : 1902.02467 . дои : 10.1007/s10664-019-09772-z . S2CID  59608676.
  48. ^ "Алгоритм. В чем разница между 'git diff --patience' и 'git diff --histogram'?". Переполнение стека . Архивировано из оригинала 19 февраля 2022 г. Проверено 28 июня 2020 г. Это действительно показывает, что разница гистограмм немного превосходит Майерса, а терпение намного медленнее, чем у других.

дальнейшее чтение

Внешние ссылки