Сравнение текста и Diff
Сравните два текста мгновенно в браузере. Просмотр бок о бок, подсветка слов, экспорт unified diff, опции игнорирования регистра/пробелов/пустых строк. 100 % в браузере — без загрузки.
Опции игнорирования
Что такое Text Diff?
Text diff — это структурированное сравнение двух текстовых документов, которое находит минимальный набор вставок и удалений, переводящий один в другой. Результат делает изменение видимым: зелёный для добавленных строк, красный для удалённых, side-by-side или в формате unified patch (формат `---/+++/@@`, используемый `git`, GitHub и Unix-командой `patch`).
Под капотом любой современный diff — это алгоритм наибольшей общей подпоследовательности (LCS). Статья Юджина Майерса 1986 года про O((N+M)D) — каноническая эффективная реализация; классическое динамическое программирование (которое используется здесь, с обрезкой общих префиксов/суффиксов) проще и отлично подходит для типичных веб-входов. После выравнивания строк соседние пары удаление+добавление проходят второй LCS на уровне токенов, чтобы рендерер мог подсветить только те слова, которые действительно изменились внутри строки — то, что ревьюеры называют intra-line или word-level diff.
Почему не сравнивать просто посимвольно? Потому что правки редко плоские: вставка одной строки в середину файла из 200 строк сдвигает все нижестоящие. Наивный `===` объявил бы все 199 строк различными. LCS говорит правду: добавлена одна строка, 199 без изменений.
Этот инструмент выполняет всё сравнение в браузере. Без загрузок, без временных файлов, без логов. Безопасно для проприетарного кода, редлайна договоров, приватных логов — всего, что не хочется вставлять на сторонний сервер. Нужно сравнить JSON? Используйте структурный JSON Diff, чтобы порядок ключей и пробелы перестали быть шумом. Сравниваете два конфига в YAML или CSV? Сначала сконвертируйте через YAML to JSON или JSON to CSV, а затем используйте подходящий diff для формата.
// Two strings that look 'mostly the same' but a naïve check disagrees const a = 'hello world'; const b = 'hello, world!'; // Character equality a === b; // false — but only 3 characters actually changed. // LCS-style diff (this tool, at line + word granularity) // → 1 line modified, inline highlight: 'hello[, ]world[!]' // → unified patch: // --- original // +++ modified // @@ -1 +1 @@ // -hello world // +hello, world!
Ключевые возможности
Side-by-Side + Unified
Переключайтесь между визуальным двухколоночным режимом (для человеческого ревью) и каноническим форматом unified-diff (для `git apply`, инструментов ревью, баг-репортов).
Inline-подсветка на уровне слов
Когда две строки спарены как изменённые, цветным фоном выделены только изменённые токены. Взгляд находит правку мгновенно, а не сканирует 80 символов.
Игнорирование регистра / пробелов / пустых строк
Четыре независимых переключателя: регистр, все пробелы, только конечные пробелы, пустые строки. Воспроизводит `git diff -i -w -b` за пару кликов.
Экспорт unified diff
Скопируйте чистый патч `---/+++/@@` с тремя строками контекста. Вставляется прямо в комментарий PR, баг-репорт или `patch -p1`.
100 % в браузере
Входы никогда не покидают устройство. Без загрузки на сервер, без аналитики по тексту. Работает офлайн после загрузки страницы. Безопасно для проприетарного кода и конфиденциальных текстов.
Поддержка Unicode и RTL
Разбивает токены по границам слов Unicode. Арабский, иврит и CJK-контент сравниваются чисто; варианты переводов строк (CRLF, LF, CR) нормализуются.
Примеры
Code review — переименована одна переменная
function getUser(id) {
const u = db.users.find(x => x.id === id);
return u;
} function getUser(userId) {
const u = db.users.find(x => x.id === userId);
return u;
} Параллельный режим подсвечивает каждую строку с переименованием, а пословный inline-diff приглушает неизменённые токены — ревьюер сразу видит, какой идентификатор изменился.
Правка договора — добавлен один пункт
1. The service is provided as-is. 2. Either party may terminate with 30 days notice. 3. Disputes are resolved in California courts.
1. The service is provided as-is. 2. Either party may terminate with 30 days notice. 2a. Termination notice must be in writing. 3. Disputes are resolved in California courts.
Единственное отличие — вставленный пункт (строка 2a). Окружающий контекст остаётся чистым — удобно для редлайна договоров или документов с политиками.
Анализ логов — изменилось время запроса
GET /api/users 200 14ms POST /api/orders 201 88ms GET /api/orders/42 200 21ms
GET /api/users 200 14ms POST /api/orders 201 4200ms GET /api/orders/42 500 21ms
Меняются две строки. Inline-подсветка показывает дрейф латентности 88ms → 4200ms и статус-код 200 → 500. Базовый сценарий для таймлайна инцидента.
Trailing whitespace — включить 'Игнорировать в конце'
margin: 0; padding: 0; border: none;
margin: 0; padding: 0; border: none;
Без опции строка 1 показывает различие (пробелы в конце). Включите 'Игнорировать пробелы / табы в конце строки' — и diff станет нулевым: тот же приём, что делает `git diff -b`.
Как пользоваться
- 1
Вставьте обе версии
Исходный текст слева, изменённый справа. Живой diff рендерится по мере ввода; при больших входах (>200 КБ суммарно) переключается на ручную кнопку Diff.
- 2
Включите нужные опции игнорирования
Игнорировать регистр, все пробелы, конечные пробелы или пустые строки — каждая опция независима и сохраняется между визитами.
- 3
Читайте diff или забирайте патч
Side-by-Side для человеческого ревью, Unified — для формата `---/+++/@@`. 'Скопировать unified diff' отправляет чистый патч в буфер обмена для code review или `patch -p1`.
Типичные ловушки diff
Весь файл 'изменён' после копии Windows-vs-Unix
Если вы вставляете из Notepad на Windows в Unix-оригинал, каждая строка покажет различия из-за \r. Включите 'Игнорировать пробелы / табы в конце строки', чтобы заглушить CR-символы.
Diff: 200 modifications (all because of trailing \r)
Ignore trailing spaces / tabs → 2 real changes
Diff кричит из-за отступов
Переформатирование табов ↔ пробелов раздувает построчные diff. 'Игнорировать все пробелы' схлопывает diff к реальным семантическим изменениям.
Diff: 87 modifications (all are indent changes)
Ignore all whitespace → 4 actual changes
Одинаковые абзацы отмечены из-за одной пустой строки
Добавление или удаление одной пустой строки в прозе может сбить выравнивание целого региона. 'Игнорировать пустые строки' решает это без правки контента.
Diff: paragraph 2 'completely changed' (one blank line moved)
Ignore blank lines → no changes in paragraph 2
Diff говорит 'идентичны', но файлы разные
Почти всегда — оставшаяся включённой опция игнорирования регистра или пробелов с предыдущей сессии. Откройте панель опций игнорирования — там видны все переключатели. Выключите все, если нужно побайтово строгое сравнение.
0 differences shown, but `cmp` says the files differ
Disable all Ignore options → real diff appears
Вставленный JSON выглядит как 'всё изменилось'
Text diff считает порядок ключей значимым; JSON — нет. Для JSON-payload используйте отдельный инструмент JSON Diff — он игнорирует порядок ключей и уважает строгость типов.
Text diff on JSON: 100% of lines changed (just a key reorder)
<a href="/ru/tools/json-diff">JSON Diff</a>: 0 differences
Предупреждение об обрезке diff проигнорировано
Выше 5 000 строк на сторону вход обрезается. Если появилось предупреждение, переключитесь на `diff -u file1 file2` или `git diff --no-index` в командной строке — оба стримят и работают с гигабайтами.
Pasted a 20,000-line log — only first 5,000 lines diffed
`diff -u a.log b.log` in terminal handles full file
Частые сценарии
- Сниппет для code review
- Вставьте две версии функции в поля, чтобы увидеть переименование, удалённую ветку или новую guard-конструкцию одним взглядом. Inline-подсветка слов быстрее, чем сканирование diff GitHub ради однострочной правки.
- Редлайн договора / политики
- Вставьте вчерашний договор против сегодняшней редакции. Вставленные пункты выделяются; неизменённые абзацы уходят в серый. Экспортируйте unified-патч для юридического следа ревью.
- Анализ таймлайна логов
- Сравните срез лога SRE до инцидента со срезом во время инцидента. Дрейф латентности, статус-кодов и частоты всплывает сразу, без `awk`.
- Ревизия прозы / черновика
- Вставьте черновик и версию редактора. Пословный inline-diff показывает, какие именно предложения переписаны — незаменимо, чтобы принимать или отклонять правки по одной.
- Ревью перевода
- Сравните старый перевод с новым, чтобы подтвердить, что новый сохранил смысл, структуру и плейсхолдеры. Включите 'Игнорировать пробелы в конце строки', чтобы заглушить шум, который часто вносят переводчики.
- Аудит файлов конфигов / .env
- Сравните два файла `.env`, `docker-compose.yaml` или shell rc. С включённой опцией 'Игнорировать пустые строки' diff фокусируется на функциональных различиях, а не на форматной воде.
Технические детали
- LCS с обрезкой префикса/суффикса
- Общие начальные и конечные строки отсекаются до запуска динамического LCS. Diff 'два конфига по 2 000 строк с одной изменённой строкой' схлопывается до таблицы DP 1×1 и рендерится менее чем за миллисекунду.
- Intra-line diff на уровне токенов
- Соседние блоки удаления и добавления спариваются и токенизируются по последовательностям Unicode слов / не-слов / пробелов. Второй проход LCS даёт зелёные/красные диапазоны токенов, делающие изменённые строки читаемыми.
- Unified diff = совместим с git/patch
- Вывод следует формату `---/+++/@@ -L,C +L,C @@`, определённому для GNU patch и используемому Git, GitHub и любым инструментом code review. Применять через `pbpaste | patch -p0`.
- Лимит входа — 5 000 строк на сторону
- Выше лимита diff обрезается и предупреждает. Для входов в несколько мегабайт используйте `diff -u` или `git diff --no-index` в командной строке — они стримят и работают с гигабайтами.
Лучшие практики
- Выбирайте опции игнорирования до чтения
- Шум от пробелов в конце, CRLF и регистра заглушает сигнал. Сначала включите правильные опции; diff читается куда легче, и вы не привыкаете проскакивать 'ложные' изменения.
- Unified — для отправки, Side-by-Side — для ревью
- Визуальные колонки — для ваших глаз. Unified-патчи — для чужих терминалов. Скопированный unified diff без перевода ложится в сообщение Slack, комментарий Jira или `patch -p1`.
- Проверка адекватности через процент сходства
- Если два файла 'почти одинаковые', а сходство 30 %, у вас проблема с переводами строк или пробелами. Включите 'Игнорировать все пробелы' и проверьте снова, прежде чем читать diff.
Часто задаваемые вопросы
Отправляется ли вставленный текст на ваш сервер?
В чём разница между text diff и JSON diff?
Как игнорировать пробелы, регистр или пустые строки?
Что такое unified diff (и когда его копировать)?
Почему diff показывает изменёнными целые строки, хотя я отредактировал только одно слово?
Как обрабатываются переводы строк CRLF и LF?
Каков максимальный размер двух входов?
А что насчёт diff для кода? Понимает ли он мой язык?
Почему одна правка иногда выглядит как удалённая строка плюс добавленная?
Как считается процент сходства?
Можно ли поделиться diff с коллегой?
Работает ли diff с языками с правым письмом — арабским или ивритом?
Похожие инструменты
Все инструменты →Бесплатный тестер regex — отладка совпадений онлайн
Работа с текстом
Тестируйте регулярные выражения мгновенно на любом тексте. Подсветка совпадений, группы захвата, предпросмотр замены, разбиение и пояснение. Regex в стиле JavaScript, бесплатно, конфиденциально, без регистрации.
Бесплатный счётчик слов и символов
Работа с текстом
Подсчитывайте слова, символы, предложения, абзацы и время чтения мгновенно. Счётчик слов в реальном времени с проверкой лимитов Twitter, meta description и Instagram. Бесплатно, приватно, без регистрации.
Конвертер систем счисления — bin, hex, dec, oct
Конвертеры
Конвертация между системами счисления — двоичной, hex, десятичной, восьмеричной и любой базой 2-36 мгновенно. Бесплатно, приватно — вся обработка в браузере.
Base64 декодер и кодировщик
Кодирование и форматирование
Декодирование и кодирование Base64 онлайн бесплатно. Преобразование в реальном времени с полной поддержкой UTF-8 и эмодзи. Полная приватность — работает в браузере. Без регистрации.
Генератор crontab и конструктор cron-выражений
Дата и время
Создавайте, проверяйте и расшифровывайте cron-выражения в браузере. Предпросмотр запусков в локальном времени или UTC. POSIX 5 полей, пресеты, описание простым языком. Бесплатно и приватно.
Конвертер CSV в JSON
Кодирование и форматирование
Конвертируйте CSV в JSON в браузере. RFC 4180, определение типов, заголовок, безопасность больших целых. 100% приватно, без загрузки.