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

Работа с diff3: трёхстороннее сравнение и слияние текстовых файлов

6 min read Linux Обновлено 14 Dec 2025
diff3: трёхстороннее сравнение и слияние
diff3: трёхстороннее сравнение и слияние

Терминал Linux в ноутбуке под Ubuntu

Быстрые ссылки

  • Что такое diff
  • Чем diff3 отличается
  • Формат вывода diff3
  • Слияние с помощью diff3
  • Различия и конфликты

Краткое резюме

  • diff3 выявляет различия между тремя текстовыми файлами, чтобы помочь понять правки, версии файлов и выполнить слияние.
  • Изменения выводятся в виде хунков с номерами строк и указателями файлов для простоты анализа.
  • diff3 умеет сливать три файла и помечать конфликтные области для ручного разрешения.

Что такое diff

Diff — это вывод утилиты сравнения, показывающий изменения между файлами. Вывод содержит список различий с номерами строк и пометками, в каком именно файле находится отличие. diff3 составляет диффы сразу для трёх файлов.

Инструменты управления версиями (например, Git) автоматически делают диффы и часто удобнее для ежедневной работы. Однако diff3 полезен, когда нужно быстро сравнить три отдельных файла без репозитория, или когда вы хотите увидеть структуру отличий в терминале.

Важно: diff3 работает строка‑за‑строкой. Он подходит для исходного кода, конфигураций и любых plain-text файлов. Для бинарных форматов diff3 неприменим.

Чем diff3 отличается

diff3 принимает три имени файлов в порядке: mine, older, yours (по соглашению). Модель «mine — older — yours» предполагает общий предок (older) и две производные версии (mine и yours). Такая трёхсторонняя проверка помогает понять, какие изменения были внесены каждым участником.

Пример исходных файлов:

Это my-file.txt:

first line  
second line  
edited third line

Это old-file.txt:

first line  
second line  
third line

Это your-file.txt:

first line  
second line  
changed third line

Выполнение команды:

diff3 my-file.txt old-file.txt your-file.txt

Показ работы diff3 на трёх файлах, каждое содержит изменение в третьей строке.

diff3 сообщит, что третья строка отлична в каждом файле.

Формат вывода diff3

Различия группируются в хунки (hunks). Хунк начинается с линии, содержащей «====» и опциональный номер, обозначающий файл по позиции в командной строке. Если номер отсутствует — различия есть во всех трёх файлах.

Пример: файлы older.txt и yours.txt содержат:

Line 1  
Line 2  
Line 3

Файл mine.txt содержит изменённую первую строку:

My file Line 1  
Line 2  
Line 3

Команда:

diff3 mine.txt older.txt yours.txt

Показ работы diff3, когда изменение только в первом файле.

Разбор вывода:

  • Делимитер «====1» означает, что отличия находятся в файле номер 1 (mine.txt).
  • Префикс «1:» указывает файл 1. «1c» — означает, что в первой строке требуется изменить содержимое, чтобы привести её к общему виду.
  • Последующие блоки с «2:1c» и «3:1c» показывают соответствующие строки файлов 2 и 3. Так как они совпадают, текст показан один раз, но помечен для обоих файлов.

Если сделать mine.txt и yours.txt одинаковыми, а older.txt изменить во второй строке, diff3 покажет «====2» — хунк с отличиями во втором файле. Если один из файлов добавил строку, diff3 использует суффиксы вроде «a» (append) и покажет, где нужно вставить новую строку.

Вывод может содержать диапазоны строк. Например, «1:2,3c» означает, что в файле 1 отличаются строки 2–3.

Слияние с помощью diff3

Помимо перечисления отличий, diff3 может объединить содержимое трёх файлов в один результирующий. По сути, он пытается влить изменения из file2 и file3 в file1 (позиция аргументов имеет значение).

Команда для слияния с выводом в терминал:

diff3 -m mine.txt older.txt yours.txt

Чтобы сохранить результат в файл, перенаправьте вывод:

diff3 -m mine.txt older.txt yours.txt > merged.txt

Если правки не пересекаются, слияние пройдёт автоматически. В противном случае diff3 пометит конфликтные области специальным образом, чтобы вы могли вручную выбрать нужные строки.

Пример простого слияния (без конфликта):

mine.txt

We're going to  
run diff3  
against these files.  
Yipee!

older.txt

We're going to  
run diff3  
against these files.

yours.txt

We're going to  
run the diff3 command  
against these files.

Команды:

diff3 mine.txt older.txt yours.txt
diff3 -m mine.txt older.txt yours.txt

Запуск diff и слияния на трёх файлах без конфликтов.

Чтобы сохранить в новый файл:

diff3 -m mine.txt older.txt yours.txt > fourth.txt

Конфликты и синтаксис конфликтов

Если изменения пересекаются, в результирующем файле появится конструкция:

<<<<<<<
(текст из файла 1)
|||||||
(текст из файла 2)
=======
(текст из файла 3)
>>>>>>>

Эти маркеры указывают:

  • Между «<<<<<<<» и «|||||||» — содержимое file 1 (первый аргумент).
  • Между «|||||||» и «=======» — содержимое file 2 (второй аргумент).
  • Между «=======» и «>>>>>>>» — содержимое file 3 (третий аргумент).

Откройте результирующий файл в редакторе и вручную оставьте желаемый вариант. После разрешения конфликтов удалите маркеры.

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

Различия и конфликты

diff3 помогает не забыть, какие правки были внесены в разные версии файла. Само сравнение — автоматизировано. Слияние требует больше участия человека, но diff3 делает видимыми все конфликтные зоны.

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

Когда diff3 не подходит

  • Для бинарных файлов (изображения, архивы) diff3 бесполезен.
  • Для файлов с крупными структурированными изменениями (перемещение блоков кода, рефакторинг) построчное сравнение может быть шумным.
  • Для командной совместной работы предпочтительнее использовать VCS (Git, Mercurial) с встроенными мерджерами и историей.
  • Если нужен визуальный интерфейс для разрешения конфликтов, стоит использовать графические мерджеры.

Альтернативные подходы

  • Git merge / git rebase — при наличии репозитория; сохраняют историю и предоставляют удобные инструменты отката.
  • kdiff3 / meld / Beyond Compare — визуальные дифф/мердж-инструменты для удобного разрешения конфликтов.
  • rdiff/rsync — для синхронизации файлов на уровне изменений, но не для логического слияния.
  • custom merge drivers — когда нужен семантический мердж для специфичных форматов (JSON, XML).

Пошаговый план (mini-playbook) для слияния с diff3

  1. Сделайте резервные копии всех трёх файлов: копировать mine.txt older.txt yours.txt.
  2. Просмотрите различия без слияния:
diff3 mine.txt older.txt yours.txt
  1. Если различия небольшие и не пересекаются — сразу выполните слияние:
diff3 -m mine.txt older.txt yours.txt > merged.txt
  1. Откройте merged.txt в редакторе и найдите маркеры конфликтов «<<<<<<<»…«>>>>>>>».
  2. Разрешите каждый конфликт, оставив желаемый набор строк, затем удалите маркеры.
  3. Протестируйте получившийся файл (запустите тесты, линтер, проверку конфигурации).
  4. Задокументируйте изменения и при необходимости зафиксируйте результат в VCS.

Чек‑лист для ролей

Разработчик:

  • Сделать резервную копию своей версии.
  • Просмотреть хунки diff3 и понять суть изменений.
  • Разрешить конфликты, сохранив поведение программы.

Руководитель релизов / инженер по интеграции:

  • Проверить слияния на предмет регрессий.
  • Запустить автоматические тесты и линтеры.
  • Проверить, не требует ли слияние дополнительных изменений в документации.

Тестер:

  • Тестировать критичные сценарии, связанные с конфликтными блоками.
  • Подготовить кейсы регрессии.

Ментальные модели и эвристики

  • Если два файла совпадают и отличаются от третьего, скорее всего, нужно принять консенсус двух версий и изменить аутлайер.
  • Если все три файла разные — приоритет должен определяться исходя из контекста: чей код стабильнее, чей функционал важнее, или объединением вручную.
  • Маленькие изменения (пара строк) проще просмотреть вручную. Большие слияния лучше выполнять в ветке и с тестами.

Примеры команд и часто используемые флаги

  • Просмотр различий:
diff3 mine.txt older.txt yours.txt
  • Слияние в stdout:
diff3 -m mine.txt older.txt yours.txt
  • Слияние в файл:
diff3 -m mine.txt older.txt yours.txt > merged.txt
  • Сравнить только и показать контекст (опции diff могут варьироваться):
diff3 -A mine.txt older.txt yours.txt

(Опции зависят от реализации diff3 в вашей системе; прочитайте man diff3 для списка доступных ключей.)

Решение: когда использовать diff3, когда Git, когда GUI

flowchart TD
  A[Начальная задача: сравнить/слить три файла?] --> B{Файлы в репозитории?}
  B -- Да --> C[Используйте git merge или git rebase]
  B -- Нет --> D{Файлы текстовые и построчные?}
  D -- Да --> E[Используйте diff3]
  D -- Нет --> F[Используйте специализированные инструменты]
  E --> G{Нужен визуальный обзор?}
  G -- Да --> H[Откройте merged.txt в графическом редакторе или используйте meld/kdiff3]
  G -- Нет --> I[Разрешите конфликты вручную в редакторе]

1‑строчный глоссарий

  • Hunk — блок соседних строк с отличиями.
  • Merge — процесс объединения изменений из нескольких версий.
  • Conflict — пересечение несовместимых правок, требующее ручного вмешательства.

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

  • Все конфликтные регионы разрешены и маркеры удалены.
  • Файл проходит локальные тесты и проверки статики.
  • Изменения документированы и при необходимости закоммичены в репозиторий.

Советы по локализации и совместной работе

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

Краткое резюме

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

Примечание: изучите man diff3 на вашей системе для уточнения доступных опций и возможных отличий реализации.

Поделиться: 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 быстро