Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

История [ править ]

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

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

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

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

Режимы в Emacs также позволяют конвертировать формат патчей и даже редактировать патчи в интерактивном режиме.

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

Алгоритм [ править ]

Операция diff основана на решении самой длинной общей проблемы подпоследовательности . [4]

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

 б  с  д  е  г ч J д г
 б  с  д е е  г я J krxy г

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

abcdfgjz

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

ehiqkrxy+ - + - + + + +

Использование [ править ]

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

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

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

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

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

Выходные вариации [ править ]

Редактировать скрипт [ править ]

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

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

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

Формат контекста [ править ]

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

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

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

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

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

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

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

Единый формат [ править ]

Унифицированный формат (или Унифицированный ) [9] [10] наследует технические улучшения , сделанные в формате контекст, но дает меньший дифференциал со старым и новым текстом , представленным в непосредственной близости. Унифицированный формат обычно вызывается с помощью « -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 первого диапазона; все остальные значения могут быть вычислены из diff.

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

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

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

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

Команда 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, которые используются и понимаются определенными программами и в определенных контекстах. Например, некоторые системы контроля версий, такие как Subversion, указывают номер версии, «рабочую копию» или любой другой комментарий вместо или в дополнение к метке времени в разделе заголовка diff.

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

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

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

Реализации и сопутствующие программы[ редактировать ]

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

GNU diff и diff3 включены в пакет diffutils вместе с другими утилитами, относящимися к diff и patch . [17] В настоящее время также существует пакет patchutils , который может комбинировать, переупорядочивать, сравнивать и исправлять контекстные различия и унифицированные различия. [18]

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

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

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

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

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

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

colordiff - это оболочка Perl для 'diff', выводящая тот же результат, но с красивой подсветкой «синтаксиса». [23]

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

Утилиты, сравнивающие исходные файлы по их синтаксической структуре, были созданы в основном как инструменты исследования для некоторых языков программирования; [24] [25] [26] некоторые из них доступны как коммерческие инструменты. [27] [28] Кроме того, бесплатные инструменты, выполняющие различие с учетом синтаксиса, включают:

  • C ++: зограф, на основе AST. [29]
  • HTML: Daisydiff, [30] HTML- разн .
  • XML: xmldiffpatch от Microsoft и xmldiffmerge для IBM. [31] [32]
  • JavaScript : astii (на основе AST).
  • Многоязычный: Pretty Diff (код формата, а затем diff) [33]

Spiff представляет собой вариант дифференциала , который игнорирует различия в вычислениях с плавающей точкой с ошибками округления и пробелами , оба из которых , как правило , не имеет отношение к сравнению с исходным кодом. Bellcore написал оригинальную версию. [34] [35] HPUX порт является самым актуальным публичным релизом. spiff не поддерживает двоичные файлы. Spiff выводит на стандартный вывод в стандартном формате различий и принимает входные сигналы в C , Bourne оболочки , Fortran , Modula-2 и лисповских языков программирования . [36] [37] [34][38] [35]

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

См. Также [ править ]

  • Сравнение инструментов сравнения файлов
  • Дельта-кодирование
  • Оператор разницы
  • Изменить расстояние
    • Расстояние Левенштейна
  • History of software configuration management
  • Longest common subsequence problem
  • Microsoft File Compare
  • Revision control
  • Software configuration management

Other free file comparison tools[edit]

  • cmp
  • comm
  • Kompare
  • tkdiff
  • WinMerge (Microsoft Windows)
  • meld
  • Pretty Diff

References[edit]

  1. ^ MacKenzie et al. "Binary Files and Forcing Text Comparison" in Comparing and Merging Files with GNU Diff and Patch. Downloaded 28 April 2007. [1]
  2. ^ Eric S. Raymond (ed.), "diff", The Jargon File, version 4.4.7
  3. ^ IEEE Computer Society; The Open Group (26 September 2008). Standard for Information Technology—Portable Operating System Interface (POSIX) Base Specifications, Issue 7. pp. 2599–2607. IEEE Std. 1003.1-2001 specifies traditional, "ed script", and context diff output formats; IEEE Std. 1003.1-2008 added the (by then more common) unified format.
  4. ^ a b James W. Hunt; M. Douglas McIlroy (June 1976). "An Algorithm for Differential File Comparison" (PDF). Computing Science Technical Report, Bell Laboratories. 41.
  5. ^ Larry Wall (November 9, 1984). "A patch applier--YOU WANT THIS!!!". Newsgroup: net.sources. Usenet: [email protected]. Retrieved May 11, 2015.
  6. ^ Larry Wall (November 29, 1984). "patch version 1.2--YOU WANT THIS". Newsgroup: net.sources. Usenet: [email protected]. Retrieved May 11, 2015.
  7. ^ Larry Wall (May 8, 1985). "patch version 1.3". Newsgroup: net.sources. Usenet: [email protected]. Retrieved May 11, 2015.
  8. ^ David MacKenzie; Paul Eggert; Richard Stallman (1997). Comparing and Merging Files with GNU Diff and Patch. Bristol: Network Theory. ISBN 978-0-9541617-5-0.
  9. ^ "Detailed Description of Unified Format". GNU Diffutils (version 3.7, 7 January 2018).
  10. ^ van Rossum, Guido. "Unified Diff Format". All Things Pythonic.
  11. ^ 2.2.3 Showing Which Sections Differences Are in, GNU diffutils manual
  12. ^ Unified Diff Format by Guido van Rossum, June 14, 2006
  13. ^ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403 Section 3.206
  14. ^ E. Myers (1986). "An O(ND) Difference Algorithm and Its Variations". Algorithmica. 1 (2): 251–266. CiteSeerX 10.1.1.4.6927. doi:10.1007/BF01840446. S2CID 6996809.
  15. ^ Webb Miller; Eugene W. Myers (1985). "A File Comparison Program". Software — Practice and Experience. 15 (11): 1025–1040. CiteSeerX 10.1.1.189.70. doi:10.1002/spe.4380151102.
  16. ^ Esko Ukkonen (1985). "Algorithms for Approximate String Matching". Information and Control. 64 (1–3): 100–118. doi:10.1016/S0019-9958(85)80046-2.
  17. ^ GNU Diff utilities. Made available by the Free Software Foundation. Free Documentation. Free source code.
  18. ^ Waugh, Tim (12 June 2020). "twaugh/patchutils".
  19. ^ "merge (GNU RCS 5.10.0)". gnu.org. Retrieved 22 January 2021.
  20. ^ Moolenaar, Bram. "Vim documentation: diff". vimdoc.sourceforge.net. Retrieved 1 May 2020. The easiest way to start editing in diff mode is with the "vimdiff" command. This starts Vim as usual, and additionally sets up for viewing the differences between the arguments. vimdiff file1 file2 [file3] [file4] [...file8] This is equivalent to: vim -d file1 file2 [file3] [file4] [...file8]
  21. ^ a b Brabandt, Christian (1 December 2018). "The power of diff". Vimways. Archived from the original on 2 December 2018. Retrieved 1 May 2020.
  22. ^ "gnu.org". www.gnu.org.
  23. ^ "colordiff". www.colordiff.org.
  24. ^ Horwitz, Susan (June 1990). "Identifying the semantic and textual differences between two versions of a program". ACM SIGPLAN Notices. 25 (6): 234–245. CiteSeerX 10.1.1.49.3377. doi:10.1145/93548.93574.
  25. ^ Yang, Wuu (July 1991). "Identifying syntactic differences between two programs". Software: Practice and Experience. 21 (7): 739–755. CiteSeerX 10.1.1.13.9377. doi:10.1002/spe.4380210706.
  26. ^ Grass. Cdiff: A syntax directed Diff for C++ programs. Proceedings USENIX C++ Conf., pp. 181-193, 1992
  27. ^ Compare++, http://www.coodesoft.com/ Archived 2011-11-29 at the Wayback Machine
  28. ^ SmartDifferencer, http://www.semanticdesigns.com/Products/SmartDifferencer
  29. ^ "xaizek/zograscope". GitHub. 26 May 2020.
  30. ^ DaisyDiff, https://code.google.com/p/daisydiff/
  31. ^ xmldiffpatch, http://msdn.microsoft.com/en-us/library/aa302294.aspx
  32. ^ xmldiffmerge, http://www.alphaworks.ibm.com/tech/xmldiffmerge
  33. ^ Cheney, Austin. Pretty Diff - Documentation. http://prettydiff.com/documentation.php Archived 2012-07-31 at the Wayback Machine
  34. ^ a b dontcallmedotcom. "spiff". Retrieved 2013-06-16.
  35. ^ a b Nachbar, Daniel W (1999-12-01). "HP-UX Porting and Archiving". UK. Retrieved 2013-06-13.
  36. ^ "SPIFF 1". 1988-02-02. Retrieved 2013-06-16.
  37. ^ Nachbar, Daniel W (1988-02-02). "Man page". UK. Retrieved 2013-06-16.
  38. ^ Davide (2009-09-28). "stackoverflow". Retrieved 2013-06-16.
  39. ^ Libenzi, Davide. "LibXDiff". SourceForge FreshMeat.
  40. ^ Nugroho, Yusuf Sulistyo; Hata, Hideaki; Matsumoto, Kenichi (January 2020). "How different are different diff algorithms in Git?: Use --histogram for code changes". Empirical Software Engineering: 790–823. doi:10.1007/s10664-019-09772-z. S2CID 59608676.
  41. ^ "algorithm - What's the difference between 'git diff --patience' and 'git diff --histogram'?". Stack Overflow. This does indeed show that histogram diff slightly beats Myers, while patience is much slower than the others.

Further reading[edit]

  • Paul Heckel (April 1978). "A technique for isolating differences between files". Communications of the ACM. 21 (4): 264–268. doi:10.1145/359460.359467. S2CID 207683976.A technique for isolating differences between files
  • A generic implementation of the Myers SES/LCS algorithm with the Hirschberg linear space refinement (C source code)

External links[edit]

  • diff: compare two files – Commands & Utilities Reference, The Single UNIX Specification, Issue 7 from The Open Group
  • diff(1) – Plan 9 Programmer's Manual, Volume 1
  • diff(1) – Inferno General commands Manual
  • File comparison at Curlie
  • JavaScript Implementation