Кратчайший diff не всегда единственный. При повторах алгоритм часто может сопоставить раннюю или позднюю копию и сохранить одинаковый максимум строк. Оба сценария требуют одинакового числа вставок и удалений. Детерминированный инструмент должен стабильно выбрать один путь, раскрыть правило и не выдавать выбранное выравнивание за знание того, где автор переместил или отредактировал содержание.

Пути равной длины требуют правила

Рассмотрим исходные `A, B` и новые `B, A`. В порядке можно сохранить только одну строку. Совпадение `A` даёт одну вставку и удаление; совпадение `B` стоит столько же. TextDiff смотрит таблицу LCS и при равной длине оставшихся совпадений сначала потребляет удаление из оригинала. Поэтому пример удаляет `A`, сохраняет `B` и добавляет `A`. Повторный запуск даёт тот же порядок на каждом маршруте.

Построчный diff не доказывает перемещение

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

Используйте контекст, когда выравнивание важно

Повторяющиеся заголовки, скобки, пустые строки и шаблонный текст обычны в исходниках и документах. Кратчайший сценарий может сопоставить такие токены не там, где ожидал проверяющий. Читайте неизменённый контекст вокруг блока, сравнивайте номера обеих версий и делите длинный повторяющийся документ на фрагменты. Не считайте выбранное выравнивание доказательством авторства, копирования, юридической силы или смыслового равенства. Это воспроизводимый синтаксический путь по двум последовательностям.