stringtranslate.com

разница

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

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

История

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

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

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

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

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

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

Алгоритм

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

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

а  б  в  г  е  ж з к ц я
а  б  в  г д е ж и й кр ху я

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

abcdfgjz

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

ehiqkrxy+ - + - + + + +

Использование

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

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

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

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

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

Выходные вариации

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Расширения

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

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

Индекс: путь/к/файлу.cpp

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

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

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

Изменения с 1975 года включают улучшения основного алгоритма, добавление полезных функций в команду и разработку новых форматов вывода. Базовый алгоритм описан в статьях An O(ND) Difference Algorithm and its Variations Юджина В. Майерса [19] и в A File Comparison Program Вебба Миллера и Майерса. [20] Алгоритм был независимо обнаружен и описан в Algorithms for Approximate String Matching Эско Укконена . [21] Первые издания программы diff были разработаны для сравнения строк текстовых файлов, ожидающих символ новой строки для разделения строк. К 1980-м годам поддержка двоичных файлов привела к изменению дизайна и реализации приложения.

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

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

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

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

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

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

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

colordiff — это оболочка Perl для «diff», которая выдает тот же вывод, но с раскрашиванием добавленных и удаленных битов. [27] diff-so-fancy и diff-highlight — более новые аналоги. [28] «delta» — это переписанный 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. ^ MacKenzie et al. "Binary Files and Forcing Text Comparison" в Comparing and Merging Files with 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 Computer Society ; The Open Group (26 сентября 2008 г.). Стандарт для информационных технологий — Базовые спецификации интерфейса переносимой операционной системы (POSIX), выпуск 7. стр. 2599–2607.Стандарт IEEE 1003.1-2001 определяет традиционные форматы вывода «ed script» и context diff; стандарт IEEE 1003.1-2008 добавил (к тому времени более распространенный) унифицированный формат.
  4. ^ https://minnie.tuhs.org/cgi-bin/utree.pl?file=V5/usr/source/s1/diff1.c
  5. ^ ab Джеймс У. Хант; М. Дуглас Макилрой (июнь 1976 г.). "Алгоритм для дифференциального сравнения файлов" (PDF) . Технический отчет по вычислительной науке, Bell Laboratories . 41 . Архивировано (PDF) из оригинала 2014-12-26 . Получено 2015-05-06 .
  6. Ларри Уолл (9 ноября 1984 г.). «Устройство для наложения заплаток — ВЫ ХОТИТЕ ЭТО!!!». Группа новостей : net.sources. Usenet:  [email protected]. Архивировано из оригинала 19 февраля 2022 г. Получено 11 мая 2015 г.
  7. Ларри Уолл (29 ноября 1984 г.). "patch version 1.2--YOU WANT THIS". Группа новостей : net.sources. Usenet:  [email protected]. Архивировано из оригинала 21 марта 2020 г. Получено 11 мая 2015 г.
  8. Ларри Уолл (8 мая 1985 г.). "patch version 1.3". Группа новостей : net.sources. Usenet:  [email protected]. Архивировано из оригинала 19 февраля 2022 г. Получено 11 мая 2015 г.
  9. ^ diff  – Справочник по оболочкам и утилитам, Единая спецификация UNIX , версия 4 от The Open Group
  10. ^ Дэвид Маккензи; Пол Эггерт; Ричард Столлман (1997). Сравнение и слияние файлов с помощью GNU Diff и Patch. Бристоль: Теория сетей. ISBN 978-0-9541617-5-0. Архивировано из оригинала 2015-03-31 . Получено 2015-03-17 .
  11. ^ "Подробное описание унифицированного формата". GNU Diffutils (версия 3.7, 7 января 2018 г.) . Архивировано из оригинала 18 января 2020 г. Получено 29 января 2020 г.
  12. ^ ван Россум, Гвидо. "Unified Diff Format". All Things Pythonic . Архивировано из оригинала 2019-12-25 . Получено 2020-01-29 .
  13. ^ 2.2.3 Демонстрация различий в разделах, руководство GNU diffutils
  14. Unified Diff Format , Гвидо ван Россум , 14 июня 2006 г.
  15. ^ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403 Архивировано 29.04.2013 в разделе Wayback Machine 3.206
  16. ^ «Неполные строки (Сравнение и объединение файлов)». www.gnu.org .
  17. ^ "git: apply.c". Git. 8 мая 2023 г.
  18. ^ "patch.c\src - patch.git - GNU patch". git.savannah.gnu.org . В diff-файлах в стиле git состояние "до" каждого патча относится к исходному состоянию до изменения любых файлов,..
  19. ^ Э. Майерс (1986). «О(ND) разностный алгоритм и его вариации». Algorithmica . 1 (2): 251–266. CiteSeerX 10.1.1.4.6927 . doi :10.1007/BF01840446. S2CID  6996809. 
  20. ^ Вебб Миллер; Юджин В. Майерс (1985). «Программа сравнения файлов». Программное обеспечение: практика и опыт . 15 (11): 1025–1040. CiteSeerX 10.1.1.189.70 . doi :10.1002/spe.4380151102. S2CID  15489614. 
  21. ^ Эско Укконен (1985). «Алгоритмы для приблизительного сопоставления строк». Информация и управление . 64 (1–3): 100–118. doi : 10.1016/S0019-9958(85)80046-2 .
  22. ^ Утилиты GNU Diff Архивировано 16.03.2015 на Wayback Machine . Предоставлено Free Software Foundation . Бесплатная документация. Бесплатный исходный код.
  23. ^ "merge (GNU RCS 5.10.0)". gnu.org . Архивировано из оригинала 18 сентября 2019 . Получено 22 января 2021 .
  24. ^ Moolenaar, Bram . "Vim documentation: diff". vimdoc.sourceforge.net . Архивировано из оригинала 16 февраля 2020 г. Получено 1 мая 2020 г. Самый простой способ начать редактирование в режиме diff — использовать команду "vimdiff". Это запускает Vim как обычно и дополнительно настраивает просмотр различий между аргументами. Это эквивалентно:vimdiff file1 file2 [file3] [file4] [...file8]vim -d file1 file2 [file3] [file4] [...file8]
  25. ^ ab Brabandt, Christian (1 декабря 2018 г.). "The power of diff". Vimways . Архивировано из оригинала 2 декабря 2018 г. . Получено 1 мая 2020 г. .
  26. ^ "gnu.org". www.gnu.org . Архивировано из оригинала 2020-08-11 . Получено 2020-09-12 .
  27. ^ "colordiff". www.colordiff.org . Архивировано из оригинала 2018-06-14 . Получено 2018-06-14 .
  28. ^ "diff-so-fancy". So Fancy. 6 мая 2023 г.
  29. Дэвисон, Дэн (8 мая 2023 г.). «дандависон/дельта». Гитхаб .
  30. ^ Waugh, Tim (12 июня 2020 г.). "twaugh/patchutils". GitHub . Архивировано из оригинала 1 октября 2020 г. . Получено 28 июня 2020 г. .
  31. ^ Хорвиц, Сьюзен (июнь 1990 г.). «Определение семантических и текстовых различий между двумя версиями программы». ACM SIGPLAN Notices . 25 (6): 234–245. CiteSeerX 10.1.1.49.3377 . doi :10.1145/93548.93574. Архивировано из оригинала 2010-06-12 . Получено 2017-11-01 . 
  32. ^ Yang, Wuu (июль 1991 г.). «Определение синтаксических различий между двумя программами». Software: Practice and Experience . 21 (7): 739–755. CiteSeerX 10.1.1.13.9377 . doi :10.1002/spe.4380210706. S2CID  10853673. 
  33. ^ Grass. Cdiff: Синтаксис, направленный на Diff для программ на C++. Труды USENIX C++ Conf., стр. 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. ^ "xaizek/zograscope". GitHub . 26 мая 2020 г. Архивировано из оригинала 21 декабря 2020 г. Получено 27 июня 2020 г.
  37. ^ DaisyDiff , https://code.google.com/p/daisydiff/ Архивировано 19.03.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.09.2009 на Wayback Machine
  40. ^ Чейни, Остин. Pretty Diff - Документация . http://prettydiff.com/documentation.php Архивировано 31 июля 2012 г. на Wayback Machine
  41. ^ ab dontcallmedotcom. "spiff". GitHub . Архивировано из оригинала 2015-03-26 . Получено 2013-06-16 .
  42. ^ ab Nachbar, Daniel W (1999-12-01). "HP-UX Porting and Archiving". Великобритания. Архивировано из оригинала 2012-09-05 . Получено 2013-06-13 .
  43. ^ "SPIFF 1". 1988-02-02. Архивировано из оригинала 2016-10-02 . Получено 2013-06-16 .
  44. ^ Nachbar, Daniel W (1988-02-02). "Man page". Великобритания. Архивировано из оригинала 2012-09-10 . Получено 2013-06-16 .
  45. ^ Davide (28.09.2009). "stackoverflow". Архивировано из оригинала 19.02.2022 . Получено 16.06.2013 .
  46. ^ Libenzi, Davide. "LibXDiff". SourceForge FreshMeat . Архивировано из оригинала 2020-07-01 . Получено 2020-06-28 .
  47. ^ Нугрохо, Юсуф Сулистё; Хата, Хидеаки; Мацумото, Кеничи (январь 2020 г.). «Чем отличаются различные алгоритмы сравнения в Git?: Используйте --histogram для изменений кода». Эмпирическая программная инженерия : 790–823. arXiv : 1902.02467 . doi : 10.1007/s10664-019-09772-z . S2CID  59608676.
  48. ^ "algorithm - В чем разница между 'git diff --patience' и 'git diff --histogram'?". Stack Overflow . Архивировано из оригинала 2022-02-19 . Получено 2020-06-28 . Это действительно показывает, что histogram diff немного превосходит Myers, в то время какpatient намного медленнее других.

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

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