Гид по технологиям

Как пользоваться diff3: сравнение трёх файлов в Linux

• 6 min read • Linux • Обновлено 26 Nov 2025
Использование diff3 для сравнения трёх файлов
Использование diff3 для сравнения трёх файлов

Иллюстрация: сравнение трёх файлов с помощью утилиты diff3

Краткое введение

diff3 — это инструмент, который сравнивает не две, а три версии файлов: обычно «оригинал» и две его изменённые копии. Его удобно использовать, когда нужно понять, какие строки изменились в каждой версии и подготовиться к слиянию. Короткое определение: diff3 показывает различия между тремя файлами и может помочь создать объединённую (merged) версию с пометками конфликтов.

Важно: diff3 оперирует построчно и чувствителен к кодировке и концу строки (LF vs CRLF). Для корректной работы рекомендуется использовать UTF-8 и единый стиль концов строк.

Установка diff3

На большинстве дистрибутивов Linux diff3 уже установлен как часть пакета GNU Diffutils. На Ubuntu это обычно так. Если у вас нет diff3, установите пакет GNU Diffutils через менеджер пакетов вашей системы (apt, yum, pacman и т.д.). Для деталей — см. man diff3 или документацию вашего дистрибутива.

Важно: в статьях и примерах ниже мы используем простые файлы с тривиальным содержимым для демонстрации формата вывода diff3.

Как читать базовый вывод diff3

Общий формат работы прост: команда принимает три файла в аргументах, затем печатает блоки различий со служебными метками. Команда:

diff3 file1 file2 file3

Ниже — несколько пошаговых примеров. Сохранённые содержимые файлов приведены как есть — они используются в командах и в выводе.

Пример 1 — изменение в первом файле

file1:

This is line1 with some change  
This is line2  
This is line3

file2:

This is line1  
This is line2  
This is line3

file3:

This is line1  
This is line2  
This is line3

Запуск:

diff3 file1 file2 file3

Вывод:

====1  
1:1c  
 This is line1 with some change  
2:1c  
3:1c  
 This is line1

Пояснение:

  • Строка, начинающаяся с четырёх знаков ‘=’ и завершающаяся цифрой 1, указывает, что изменение обнаружено в первом файле.
  • Метки вида 1:1c означают: “файл1, строка1, содержится (contains)” — далее идёт соответствующая строка.
  • Аналогично 2:1c и 3:1c показывают содержимое первой строки для file2 и file3. Поскольку file2 и file3 совпадают, их строка показана один раз.

Пример 2 — изменение в третьем файле

file1:

This is line1  
This is line2  
This is line3

file2:

This is line1  
This is line2  
This is line3

file3:

This is line1 with some change  
This is line2  
This is line3

Команда та же:

diff3 file1 file2 file3

Вывод:

====3  
1:1c  
2:1c  
 This is line1  
3:1c  
 This is line1 with some change

Пояснение:

  • Первая строка ====3 говорит, что изменение в третьем файле.
  • file1 и file2 имеют одну и ту же первую строку, а file3 — отличную. diff3 показывает все варианты, сгруппированные по строкам.

Пример 3 — добавлена строка в одном из файлов

file1 и file2 те же, а file3 дополняется:

file3:

This is line1  
This is line2  
This is line3  
This is line4

Запуск:

diff3 file1 file2 file3

Вывод:

====3  
1:3a  
2:3a  
3:4c  
 This is line4

Пояснение:

  • ====3 — изменения в третьем файле.
  • Метки 1:3a и 2:3a означают, что относительно первого и второго файлов добавление идёт после третьей строки.
  • 3:4c указывает, что в третьем файле имеется четвёртая строка, которая отсутствует в файлах 1 и 2.

Более сложные сцены: несколько отличий в разных файлах

Рассмотрим случай, когда изменения есть в нескольких файлах и в разных строках.

file1:

This is line1  
This is line2 with some change  
This is line3

file2:

This is line1  
This is line2  
This is line3

file3:

This is line1  
This is line2  
This is line3 with some change

diff3 выводит:

====  
1:2,3c  
 This is line2 with some change  
 This is line3  
2:2,3c  
 This is line2  
 This is line3  
3:2,3c  
 This is line2  
 This is line3 with some change

Пояснение:

  • Первая строка без номера (====) означает, что изменения встречаются в нескольких файлах.
  • Метка 2,3 — это диапазон строк: с 2-й по 3-ю включительно. В выводе показываются соответствующие блоки каждого файла для этого диапазона.

Ещё пример с вставками в разных файлах:

file1:

This is line1  
This is line2  
This is line3  
This is line4

file2:

This is line1  
This is line2  
This is line3

file3:

This is line1  
This is line2  
This is line3  
This is line4  
This is line5

diff3 выводит:

====  
1:4c  
 This is line4  
2:3a  
3:4,5c  
 This is line4  
 This is line5

Пояснение:

  • В файле1 присутствует строка 4, в файле3 — строки 4 и 5, а в файле2 — только 3 строки.
  • Метка 2:3a указывает, что для file2 добавление идёт после строки 3; 3:4,5c показывает диапазон 4–5 в третьем файле.

Что ещё умеет diff3 (обзор возможностей)

  • Показ различий между тремя файлами и группировка вариантов по диапазонам строк.
  • Подготовка объединённого файла, в котором можно сохранить изменения обеих версий и пометить конфликты (merge). (Подробности и параметры вывода смотрите в man diff3.)
  • Генерация скриптов для редакторов/утилит (в зависимости от реализации и параметров).

Важно: для реального слияния, особенно в проектах с историей изменений, обычно применяют системы контроля версий (git, mercurial) и их встроенные механизмы merge/resolve. diff3 полезен как вспомогательный инструмент и для отладки ручных конфликтов.

Практическая памятка (cheat sheet)

  • Основная команда: diff3 file1 file2 file3
  • Для чтения man-страницы: man diff3
  • Если вывод содержит ====n, это означает, что изменения обнаружены в файле n. Если ==== без номера — изменения в нескольких файлах.
  • Метки вида i:j или i:j,k означают: файл i, строка j (или диапазон j..k).
  • Обратите внимание на кодировку и окончания строк — они влияют на результаты сравнения.

Руководство по разрешению конфликтов при помощи diff3

  1. Запустите diff3, чтобы найти блоки, где содержимое различается.
  2. Для каждого конфликтного блока посмотрите версии всех трёх файлов и оцените, какая версия правильная или как их объединить.
  3. Вручную отредактируйте итоговый файл, сохранив нужные строки; если используете автоматизацию, вставьте пометки конфликта (например, <<<<<<<, =======, >>>>>>>) и обработайте их инструментом слияния.
  4. Проверяйте результат тестами/прогоном, особенно если это код или конфигурация.

Совет: если вы используете git, встроенные механизмы merge более удобны, и git сам может использовать diff3 как один из алгоритмов слияния.

Когда diff3 не подходит — альтернативные подходы

  • Для визуального сравнения и слияния лучше подойдут gui-инструменты: meld, kdiff3, Beyond Compare.
  • Для интеграции в рабочие процессы используют системы контроля версий: git merge, git rebase, которые предоставляют управление историей и автоматизацию.
  • Для двухфайлового сравнения подойдёт обычный diff или sdiff (side-by-side view). sdiff показан в отдельном руководстве.

Модель принятия решений (короткая эвристика)

  • Нужны быстрые различия между версиями без истории: diff3.
  • Нужна история и безопасное слияние: git (или другая VCS).
  • Нужна визуальная разблюдовка и интерактивное слияние: meld/kdiff3.

Критерии приёмки

  • Для тестовых файлов с известными различиями diff3 показывает ожидаемые блоки и метки.
  • Все конфликтные блоки идентифицированы и человек может сформировать корректный объединённый файл.
  • После ручного (или автоматического) слияния итоговый файл проходит базовые проверки: синтаксические тесты, прогон приложения, проверку формата.

Тестовые случаи (короткий набор)

  • Изменение в одном файле (ожидается ====n и метки для соответствующих строк).
  • Идентичные файлы (вывода нет).
  • Добавление строк в одном файле (показывается a/c метки и диапазоны).
  • Разные изменения в нескольких файлах (показываются диапазоны и блоки для каждого файла).

Советы по локализации и кодировкам (для русскоязычных пользователей)

  • Убедитесь, что все файлы в UTF-8, иначе русские символы могут считаться различными из‑за кодировки.
  • Сравнивайте окончания строк: смешение LF и CRLF порождает ложные изменения. При необходимости приведите файлы к LF перед сравнением.
  • Если файлы генерируются Windows-приложениями, используйте dos2unix для нормализации перед запуском diff3.

Сравнение: diff3 vs простые diff и визуальные инструменты

  • diff: сравнивает две версии, выводит патч. Лучше для генерации патчей и простых случаев.
  • diff3: сравнивает три версии и полезен для анализа двух вариантов против оригинала.
  • meld/kdiff3/веб-инструменты: визуальные, удобны для интерактивного слияния.

Итог

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

Важно: если вам нужно интерактивное или визуальное слияние — рассмотрите специализированные инструменты (meld, kdiff3) или работу через git.

Дополнительные материалы: man diff3 и наш урок по sdiff.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро