В обчислювальній техніці diff - утиліта порівняння файлів, що виводить різницю між двома файлами. Ця програма виводить через підрядник зміни, зроблені в файлі (для текстових файлів). Сучасні реалізації підтримують також виконавчі файли. Висновок утиліти називається «diff», або, що більш поширене, патч. так як він може бути застосований до програми patch. Висновок схожих утиліт порівняння файлів також часто називається «diff».
Утиліта diff була розроблена на початку 1970-х років для операційної системи Unix, яка була плодом роботи ATT Bell Labs, в Мюррей Хілл (Нью-Джерсі). Фінальна версія, яка поширюється з 5ой версією Unix в 1974, була повністю написана Дугласом Макілроем.
Робота diff заснована на знаходженні найбільшою загальною підпослідовності (англ. Longest common subsequence. Проблема LCS). Наприклад, у вас є дві послідовності елементів:
і ви хочете знайти найбільш довгу послідовність елементів, яка представлена в обох послідовностях в однаковому порядку. Це означає, що ви хочете знайти нову послідовність, яка може бути отримана з першої послідовності видаленням деяких елементів або з другої послідовності видаленням інших елементів. В даному випадку такою послідовністю буде
Після отримання найбільшої загальної послідовності залишається тільки невеликий крок до отримання схожого на diff виведення:
diff викликається з командного рядка з іменами двох файлів в якості аргументів: diff originalnew. Висновок команди є зміни, які потрібно зробити в вихідному файлі original, щоб отримати новий файл new. Якщо original і new - директорії, то diff автоматично буде застосований до кожного файлу, який існує в обох директоріях. Всі приклади в цій статті використовують такі два файли, original і new:
Команда diff original new проводить наступний нормальний дифф-висновок:
У цьому традиційному форматі виведення a означає додано (від англ. Add), d - видалено. з - змінено. Перед буквами a, d або c стоять номери рядків вихідного файлу, після них - номера рядків кінцевого файлу. Кожен рядок, яка була додана, видалена або змінена, передує кутовими дужками.
За замовчуванням, загальні для вихідного і кінцевого файлів номера рядків не вказуються. Рядки, які переміщені, показуються як додані на своєму новому місці і вилучені зі свого минулого розташування.
У контекстному форматі змінені рядки показуються разом з непорушними рядками до і після ізмененённого фрагмента. Вставка будь-якої кількості незачеплених рядків надає контекст для патча. Контекст. що складається з незачеплених рядків служить посиланням для визначення положення змінюваного фрагмента в цільовому файлі, навіть якщо номера змінюваних рядків у вихідному і цільовому файлах не збігаються.
Висновок команди diff -c original new: