Як працюють алгоритми diff
Кожен вигляд diff на цій сторінці створюється алгоритмом Myers — технікою 1986 року від Eugene W. Myers, що знаходить найкоротший сценарій редагування між двома послідовностями токенів за час O((N+M)D), де D — відстань редагування. Алгоритм побудований навколо задачі Longest Common Subsequence, і рушій виконується повністю у вашому браузері за допомогою бібліотеки jsdiff з відкритим кодом.
- Токенізація введення — Перед порівнянням алгоритм розбиває кожне введення на послідовність токенів. Гранулярність по рядках розбиває на символи нового рядка; по словах — на межах пробілів і пунктуації; по символах — кожна кодова точка Unicode є окремим токеном.
- Побудова графу редагування — Алгоритм Myers моделює порівняння як шлях через двовимірну сітку, де рух праворуч означає «видалити з оригіналу», рух вниз означає «вставити зі зміненого», а рух по діагоналі означає «токен збігається в обох». Алгоритм знаходить найкоротший шлях, переважно діагональний.
- Витяг LCS — Діагональні переміщення в найкоротшому шляху відстежують Longest Common Subsequence — токени, що з'являються в обох введеннях в однаковому відносному порядку. Кожен токен в LCS є «незміненим»; все інше є або додаванням, або видаленням.
- Застосування опцій попередньої обробки — Якщо ви ввімкнете «Ігнорувати регістр», обидва введення переводяться в нижній регістр перед проходом LCS, щоб «HELLO» та «hello» вважалися ідентичними. «Ігнорувати пробіли» зводить кілька пробілів до одного. «Обрізати кожен рядок» видаляє початкові та кінцеві пробіли кожного рядка перед порівнянням.
- Відображення обраного вигляду — Результат — той самий результат LCS, відображений трьома способами: Поруч показує оригінал ліворуч і змінений праворуч у двоколонній сітці з червоними та зеленими рядками. Об'єднаний показує один стовпець із рядками, що починаються на − та +, як вивід
git diff. Вбудований показує видалення як червоний закреслений текст та додавання як зелений підкреслений текст у тому самому текстовому потоці. - Розрахунок підсумку — Після відображення інструмент підраховує, скільки токенів було додано, видалено та збережено, потім розраховує схожість як відношення незмінених токенів до більшого з двох вхідних довжин. Схожість 100% означає, що введення ідентичні після попередньої обробки.
Навіщо використовувати diff checker
- Перегляд коду без Git-клієнта — Вставте дві версії конфігураційного файлу, SQL-міграції або shell-скрипту та подивіться, що змінилося, без клонування репозиторію, перемикання гілок або очікування на CI-конвеєр. Інструмент зручний для швидких переглядів під час парного програмування, для передачі контрактору без спільної Git-історії та для застарілих кодових баз, що передують системам контролю версій.
- Редакторські правки в контрактах і документах — Порівняння на рівні слів показує, які терміни змінилися між чорновиками контракту, швидше ніж панель Track Changes у Word. Вставте клаузу A з першого чорновика та клаузу B з підписаної копії — підстановка підсвітиться червоним-на-зеленому саме у фразі, що змінилася.
- Перегляд редакцій ессе та чернеток — Автори, що порівнюють першу чернетку з відредагованою версією, можуть переключитися на гранулярність слів, щоб побачити кожну заміну, вставку та скорочення, не перечитуючи обидві копії. Той самий робочий процес підходить для перекладачів, які перевіряють зміни щодо вихідного тексту.
- Порівняння журналів і конфігурацій — Системні адміністратори, що порівнюють два знімки конфігурації сервера, два розклади cron або два виводи
ps aux, можуть використовувати гранулярність рядків, щоб знайти єдиний змінений параметр у 200-рядковому файлі за секунди. Поєднайте з опцією ігнорування пробілів — і шумний diff вирівнювання скоротиться до змін параметрів, що дійсно мають значення.
Поширені застосування
Текстовий diff з'являється в кінці кожного циклу редагування в написанні, розробці та операційній роботі.
- Перегляд pull request: вставте дві реалізації функції поруч, щоб зрозуміти зміну логіки перед затвердженням, без витрат на отримання гілки.
- QA інтернаціоналізації: порівняйте вихідний рядок англійською з перекладеним еквівалентом на рівні слів для виявлення вставок, упущень або замін термінів, що міг ввести перекладач.
- Аналіз інцидентів: порівнюйте два знімки маніфесту Kubernetes або два виводи «docker inspect» на рівні рядків для ізоляції зміни конфігурації, що передувала збою.
Практичний приклад
Візьмемо п'ятирядкову конфігурацію сервера. Оригінал: host=localhost, port=5432, dbname=app_db, user=app, password=secret. Змінений: host=db.prod.example.com, port=5432, dbname=app_db, user=app_prod, password=secret. З гранулярністю рядків та виглядом «Поруч» рядок 1 показує червоний ліворуч (host=localhost) і зелений праворуч (host=db.prod.example.com), рядок 4 показує червоний (user=app) і зелений (user=app_prod), а рядки 2, 3 і 5 залишаються незміненими з обох боків. Підсумок показує 2 додавання, 2 видалення, 3 без змін і схожість 60%.
Чи це запускається в моєму браузері?
Так. Весь розрахунок diff виконується на стороні клієнта за допомогою бібліотеки з відкритим кодом jsdiff, завантаженої зі сторінкою. Нічого з того, що ви вводите, вставляєте або порівнюєте, не надсилається на жоден сервер. Ви можете перевірити це самостійно: відкрийте DevTools браузера, перейдіть на вкладку Network, очистіть журнал, натисніть «Порівняти» та підтвердьте, що для кроку порівняння не запущено жодних мережевих запитів.
Що означає відсоток схожості?
Схожість розраховується як незмінені токени / max(загальна кількість токенів в оригіналі, загальна кількість токенів у зміненому). Оцінка 100% означає, що два введення ідентичні після застосування ваших опцій попередньої обробки. Оцінка 0% означає, що жоден токен не є спільним між введеннями.
Чи можна семантично порівнювати JSON / YAML / XML?
Ні в цьому інструменті. Це текстовий diff, тому переформатування JSON або XML лише з пробілами все одно показує багато змін, навіть коли дані логічно ідентичні. Зміна порядку ключів об'єктів JSON також показується як зміни, хоча більшість парсерів вважають порядок ключів несуттєвим. Нормалізуйте обидва введення до однакових відступів і порядку ключів перед вставкою сюди.
Чим відрізняються вигляди «Об'єднаний» та «Поруч»?
«Поруч» відображає два стовпці: оригінал ліворуч і змінену версію праворуч, з видаленими рядками, виділеними червоним ліворуч, і доданими рядками, виділеними зеленим праворуч. «Об'єднаний» відображає один стовпець із префіксом − і червоним фоном для видалених рядків і префіксом + і зеленим фоном для доданих рядків — той самий макет, що виводить git diff у термінал. Використовуйте об'єднаний, коли хочете скопіювати результат як файл патчу або вставити в потік code review. Використовуйте «Поруч», коли важливіше візуальне вирівнювання того, що замінило що.
Вставте оригінал ліворуч, змінену версію праворуч, оберіть вигляд і гранулярність — і порівняння з'явиться за мілісекунди. Увімкніть живий режим — і diff перезапускатиметься при кожному натисканні клавіші під час редагування будь-якої зі сторін. Завантажте результат як стандартний об'єднаний файл .patch, який безпосередньо вживає git apply. Без завантаження, без облікового запису, без API-ключа постачальника, без квоти.