Skip to content

Сравнение текста и Diff

Сравните два текста мгновенно в браузере. Просмотр бок о бок, подсветка слов, экспорт unified diff, опции игнорирования регистра/пробелов/пустых строк. 100 % в браузере — без загрузки.

Без отслеживания Работает в браузере Бесплатно
Всё сравнение выполняется локально в браузере. Текст не покидает это устройство.
Опции игнорирования
Проверено на паритет с выводом `diff -u`, корректность intra-line LCS и доступность (ARIA-роли, объявление изменений скринридером, обработка RTL/LTR). — Go Tools Text Tooling Team · May 21, 2026

Что такое 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. 1

    Вставьте обе версии

    Исходный текст слева, изменённый справа. Живой diff рендерится по мере ввода; при больших входах (>200 КБ суммарно) переключается на ручную кнопку Diff.

  2. 2

    Включите нужные опции игнорирования

    Игнорировать регистр, все пробелы, конечные пробелы или пустые строки — каждая опция независима и сохраняется между визитами.

  3. 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.

Часто задаваемые вопросы

Отправляется ли вставленный текст на ваш сервер?
Нет. Каждое сравнение выполняется на JavaScript внутри браузера. Текст не загружается, не логируется, не сохраняется на диск и не отправляется третьим лицам. В localStorage сохраняются только настройки интерфейса (режим просмотра и переключатели игнорирования), чтобы страница помнила их при следующем визите — но не сам текст. Это легко проверить: откройте DevTools → Network, нажмите Diff — ни одного запроса не уйдёт.
В чём разница между text diff и JSON diff?
Text diff сравнивает построчно — идеально для прозы, кода, логов, договоров и конфигов. JSON Diff понимает модель данных JSON: порядок ключей не важен, типы строгие, массивы можно сопоставлять по ключу. Если вставить JSON в text diff, перестановка ключей и разница в пробелах будут отмечены как изменения; JSON Diff их игнорирует. Используйте text diff для неструктурированного контента, а JSON Diff — для API-ответов и конфигурационных payload.
Как игнорировать пробелы, регистр или пустые строки?
Откройте панель 'Опции игнорирования' над diff. 'Игнорировать регистр' приравнивает A и a. 'Игнорировать все пробелы' схлопывает каждый пробел, таб и перевод строки перед сравнением. 'Игнорировать пробелы / табы в конце строки' убирает только пробелы в конце — стандартное поведение `git diff -b`. 'Игнорировать пустые строки' отбрасывает пустые строки до сравнения. Каждая опция независима и сохраняется между визитами.
Что такое unified diff (и когда его копировать)?
Unified diff — это текстовый формат `---/+++/@@`, который используют `patch`, `git apply`, GitHub PR и большинство инструментов code review. Нажмите 'Скопировать unified diff', чтобы получить патч с тремя строками контекста вокруг каждого изменения — вставьте его в баг-репорт, комментарий ревью или в команду `patch -p1`, и он применится без правок. Side-by-side — для людей, unified diff — для машин (и ревьюеров, которые думают как машины).
Почему diff показывает изменёнными целые строки, хотя я отредактировал только одно слово?
На самом деле нет — присмотритесь. Вся строка подсвечена, потому что в ней что-то изменилось, но яркий фон внутри подсветки несут только изменённые токены (зелёный для добавленных, красный с зачёркиванием для удалённых). Это intra-line word diff: контекст строки остаётся читаемым, а взгляд попадает точно на правку. Если изменены две подряд идущие строки, inline-подсветка будет в обеих.
Как обрабатываются переводы строк CRLF и LF?
Распознаются оба. Diff разбивает по \r\n, \n и одиночному \r, поэтому Windows CRLF, Unix LF и старый Mac CR корректно выравниваются. Если нужно явно отмечать изменения в переводах строк, оставьте 'Игнорировать пробелы / табы в конце строки' выключенным — \r проявится как символ в конце. Чтобы полностью убрать шум от переводов строк, включите 'Игнорировать все пробелы'.
Каков максимальный размер двух входов?
Diff работает в основном потоке, поэтому практические пределы — около 5 000 строк или 1 МБ на сторону; выше — обрезка и предупреждение. Живой diff отключается при суммарном объёме выше 200 КБ и переходит на ручную кнопку Diff. Для файлов в несколько мегабайт используйте `diff -u` или `git diff --no-index` из командной строки — они стримят и работают с гигабайтами.
А что насчёт diff для кода? Понимает ли он мой язык?
Diff не зависит от языка: он видит строки и токены, а не синтаксис. Это плюс для ревью-сниппетов, правок конфигов и скопированных патчей. Если нужен семантический code diff (переименование функции по файлам, уровень AST), используйте git, GitHub PR или специализированный structural diff. Но для 90 % сценариев code review — глянуть на функцию, сравнить два сниппета — строчный + пословный diff именно то, что нужно.
Почему одна правка иногда выглядит как удалённая строка плюс добавленная?
Когда в строке изменилось слишком много для осмысленной пословной подсветки, diff рапортует это как отдельные строки удаления и добавления, чтобы структура осталась чистой. Та же эвристика даёт читаемый вывод для переписанной прозы и блоков кода, которые переписаны, а не отредактированы. Переключитесь на Unified-вид, чтобы увидеть классический формат пары `-`/`+`, используемый в патчах.
Как считается процент сходства?
Это количество неизменённых строк (после применения опций игнорирования), делённое на большее из двух количеств строк и ограниченное 100 %. Два одинаковых входа — 100 %. Добавление одной новой строки к файлу из 100 строк даёт 99 %. Замена каждой строки — 0 %. Удобно для быстрой оценки 'это мелкая правка или полное переписывание?' ещё до чтения diff.
Можно ли поделиться diff с коллегой?
Да, двумя способами. (1) Нажмите 'Скопировать unified diff' и вставьте патч в чат, Slack или комментарий PR — любой с терминалом применит его через `patch < clip`. (2) Сделайте скриншот панели side-by-side для визуального ревью. Кнопки 'Поделиться по URL' намеренно нет: для неё пришлось бы загружать ваш текст, чего мы не делаем.
Работает ли diff с языками с правым письмом — арабским или ивритом?
Да, для текстового содержимого — строки и токены работают с Unicode. Интерфейс использует логические направления CSS, поэтому в RTL-локалях gutter и колонки строк естественным образом переворачиваются. Внутри ячейки diff направление текста следует за содержимым, поэтому арабские и ивритские строки рендерятся корректно, а маркеры +/- остаются выровнены по gutter.

Похожие инструменты

Все инструменты →

Бесплатный тестер 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% приватно, без загрузки.