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

Сравнивайте два текста рядом или в виде unified diff, с подсветкой на уровне слов, настройками пробелов и регистра и копируемым патчем.

Оригинал
Изменённый
Результат

Вставьте две версии текста для сравнения

Что делает этот инструмент

Дифф точно отвечает на один вопрос: что должно измениться, чтобы превратить один текст в другой? Вставьте оригинал в панель «Оригинал», а новую версию — в панель «Изменённый», и инструмент покажет каждую удалённую строку, каждую добавленную и — внутри изменённой строки — конкретные различающиеся слова с подсветкой. Это тот же вопрос, на который git отвечает при каждом коммите, вычисленный тем же семейством алгоритмов, целиком в вашем браузере.

Последняя часть для инструмента сравнения важнее, чем для большинства других: то, что люди сравнивают, обычно приватно — две версии продакшен-конфигурации, запрос до и после оптимизации, тело ответа, которое вчера работало, против того, что падает сегодня. Здесь они никогда не покидают ваше устройство.

Рядом или unified

Обе вид-формы показывают одно и то же сравнение, но в разной компоновке. Рядом ставит оригинал и изменённый текст друг напротив друга — колонка оригинала под панелью «Оригинал» — с выровненными совпадающими строками: естественный способ читать новую редакцию документа. Unified сплетает их в одну колонку: удаления с минусом в начале строки, добавления с плюсом — формат git log и код-ревью, компактнее и лучше, когда изменения разбросаны. Обе вид-формы показывают исходные номера строк на полях, так что находка здесь напрямую указывает на ваш файл.

Как вычисляется дифф

Инструмент реализует алгоритм различий Майерса, опубликованный в 1986 году и до сих пор используемый в git по умолчанию. Он находит кратчайший сценарий правок: минимальное число удалений и вставок строк, превращающее один текст в другой. Именно эта минимальность делает дифф читаемым — наивное сравнение, плохо синхронизирующееся после изменения, помечает целые блоки как заменённые, тогда как Майерс указывает ровно те две строки, которые действительно изменились.

Сначала сравниваются строки, затем каждая пара изменённых строк сравнивается ещё раз на уровне слов — так получается подсветка. Честное ограничение: когда у двух текстов почти нет общего, поиск минимального сценария стоил бы больше памяти, чем стоит тратить вкладке браузера, поэтому за пределами дистанции правок в две тысячи инструмент откатывается к показу всего как заменённого — и говорит об этом уведомлением, а не молча.

Настройки пробелов и регистра

Многие различия реальны, но несущественны. Файл, переотступленный с табов на пробелы, конечный пробел, добавленный редактором, ключевое слово в другом регистре — всё это настоящие изменения и всё это шум, когда вы хотите знать, изменилась ли логика. Два флажка закрывают частые случаи: один отбрасывает пробелы на краях каждой строки, другой — различия регистра. Они влияют только на то, что считается изменением — отображение всегда показывает каждую строку ровно такой, какой её вставили.

  • Игнорировать краевые пробелы — пробелы и табы в начале и конце каждой строки отбрасываются перед сравнением: изменение одних лишь отступов перестаёт выглядеть изменённой строкой. Пробелы внутри строки по-прежнему учитываются.
  • Игнорировать регистр — строки и слова, различающиеся только регистром, считаются равными. Полезно для ключевых слов SQL, имён HTTP-заголовков и других нечувствительных к регистру контекстов.

Патч, который можно скопировать

Кнопка копирования выдаёт сравнение в формате unified diff — лингва франка изменений кода. Каждый блок изменений (hunk) начинается с заголовка @@ с номерами охваченных строк, удалённые строки начинаются с минуса, добавленные с плюса, а несколько неизменённых строк контекста окружают каждый блок, чтобы изменение можно было найти, даже если файл немного сместился.

--- a
+++ b
@@ -1,3 +1,3 @@
 server:
-  port: 8080
+  port: 9090
   timeout: 30

Этот текст можно вставить в тикет или код-ревью, отправить коллеге или применить механически: сохранённый в файл, git apply или юниксовая команда patch воспроизведут изменение на оригинале. Деталь, которую стоит знать: файл без завершающего перевода строки получает в патче маркер \ No newline at end of file — инструмент воспроизводит это поведение, потому что отсутствующий финальный перевод строки — настоящее различие, а притворяться иначе значит порождать патчи, которые не применяются.

Частые вопросы

Почему сообщается об изменении, если оба текста выглядят одинаково?
Различие, скорее всего, невидимо: пробелы в конце строки, табы вместо пробелов или отсутствующий перевод строки после последней строки. Включите «игнорировать краевые пробелы», чтобы исключить первые два случая. Различие в финальном переводе строки всё равно сообщается — git тоже сообщает о нём своим маркером no-newline — потому что различие на уровне байтов реально, даже когда его не показывает ни один символ.
Почему совсем разные тексты показываются одной большой заменой?
Поиск минимального диффа стоит памяти пропорционально квадрату различия текстов. За пределами дистанции правок примерно в две тысячи изменённых строк инструмент переключается на грубый вид «всё заменено» и показывает уведомление. С двумя версиями одного документа вы туда никогда не попадёте; при сравнении двух несвязанных файлов — да.
Как применить скопированный патч?
Сохраните его в файл и выполните git apply файл.patch в репозитории, либо patch original.txt файл.patch классическим юниксовым инструментом. Патч сгенерирован против точного исходного текста, поэтому применяется чисто, пока цель не разошлась с ним.
Что-то из моего текста куда-то отправляется?
Нет. Сравнение выполняется целиком в вашем браузере — сервера, который мог бы увидеть оба текста, просто нет. В этом и смысл вычисления на стороне клиента: конфигурации, учётные данные и продакшен-данные сравниваются, не покидая вашу машину.