Как сравнить файлы по содержимому в Windows или Linux? Обзор инструментов для визуального сравнения и разрешения конфликтов слияния Сравнение файлов по размеру linux

Для сравнения двух или нескольких файлов в Linux есть команда diff. Она может сравнивать как отдельные файлы, так и каталоги. Рассмотрим синтаксис, опции команды diff и несколько примеров использования.

Синтаксис команды diff

Команда diff имеет следующий синтаксис:

Diff [опции] файлы-или-директории

Мы указываем опции и подаем на вход два или более файлов или директорий, которые нам нужно сравнить.

Опции команды diff

Рассмотрим основные опции команды diff. Я рассмотрю только те опции, которые сам использую наиболее часто.

-E игнорировать изменения, связанные с добавлением символа табуляции в тексте.
-b игнорировать изменения, связанные с добавлением пробелов.
-w игнорировать изменения, связанные с добавлением пробелов и табуляции.
-B игнорировать новые пустые строки.
-p (или —show-c-function) показать название функции языка C, в которой найдены изменения.
-y (или —side-by-side) отобразить результаты в две колонки.
-r просматривать каталоги рекурсивно.
-X FILE исключить из поиска файлы, имена которых совпадают с шаблонами в файле FILE.
-d (или —minimal) попытаться найти как можно меньше изменений (то есть исключить ложные срабатывания).

Примеры использования команды diff

Сравнение двух текстовых файлов

Для простого сравнения двух текстовых файлов с именами myfile1 и myfile2 выполним в терминале команду:

Diff myfile1 myfile2

Вывод команды diff удобно перенаправить в файл с расширением diff . Большинство текстовых редакторов в Linux, например Gedit, распознают этот файл и подсвечивают его синтаксис. Чтобы направить результат сравнения в файл changes.diff нужно использовать символ перенаправления потока (>):

Diff myfile1 myfile2 > changes.diff

Сравнение директорий, содержащих текстовые файлы

Рассмотрим пример сравнения двух директорий (mydir1 и mydir2), которые содержат текстовые файлы. Основное отличие здесь от примера выше состоит в том, что мы добавим опцию -r, означающую рекурсивный обход файлов в директориях.

Diff -r mydir1 mydir2 > changes.diff

Теперь предположим, что в директориях, в которых мы сравниваем файлы, находится много «мусора», который мы не должны сравнивать. Создадим файл excludeFiles и запишем в него шаблоны и названия файлов, которые мы не должны сравнивать. Например, содержимое excludeFiles может иметь вид:

*.o ChangeLog* *.bak *.exe

Теперь укажем команде diff, чтобы она использовала наш файл excludeFiles при сравнении каталогов:

Diff -r -X excludeFiles mydir1 mydir2 > changes.diff

Таким образом, мы сравниваем файлы, имена которых не попадают под шаблоны в файле excludeFiles, например, vasya.exe или ChangeLog12.

Добавим еще несколько опций, которые описаны выше, чтобы улучшить результат сравнения:

Diff -rwBd -X excludeFiles mydir1 mydir2 > changes.diff

Мы сравниваем файлы в директориях mydir1 и mydir2, игнорируя изменения, связанные с добавлением пустых строк, пробелов, табуляции, а также используем шаблоны имен файлов в excludeFiles, чтобы исключить из сравнения ненужные файлы.

Заключение

Дополнительную информацию по использованию команды diff в вашей системе Linux вы можете получить, выполнив команду:

Man diff

Также существуют программы, которые позволяют сравнивать файлы, используя графический интерфейс. Например, программа Meld , которая в наглядном виде показывает где и что изменилось в файлах.

), их сравнений, а также сравнений GUI-клиентов для них. Также были обсуждения плагинов к IDE для работы с git и mercurial. Но практически не было информации об инструментах визуального сравнения и разрешения конфликтов слияния.

Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). Дабы восполнить недостаток информации на хабре, я решил написать этот мини-обзор. Как говориться - по горячим следам.

Под катом Вы также найдете примеры настроек Git для использования с DiffMerge и WinMerge под Windows. Думаю многим сэкономит время.

Название Особенности Платформа

KDiff3

Git и WinMerge

1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
файл winmerge следующего содержания:

Diff_cmd () { "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$LOCAL" "$REMOTE" >/dev/null 2>&1 } merge_cmd () { "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1 status=$? }
Когда Git не может автоматически объединить изменения, происходит конфликт слияния и в конфликтующий файл добавляются маркеры слияния (<<<<<<<, =======, и >>>>>>>). Они необходимы для разрешения конфликта с помощью сторонних инструментов.
Рассмотрим файл readme.txt который образуется в результате выполнения слияния веток master и new в приведенном выше примере:

<<<<<<< HEAD master str ======= new str >>>>>>> new
Мы можем открыть файл конфликтов с помощью программы WinMerge для разрешения конфликта.

После этого откроется средство двухстороннего слияния:

Исходя из описанной логики перепишем команду слияния merge_cmd следующим образом:
merge_cmd () { "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$MERGED" >/dev/null 2>&1 status=$? }
По сути, оба приведенных варианта эквивалентны.

2) Отредактируем .gitconfig
tool = winmerge cmd = "winmerge" tool = winmerge cmd = "winmerge" trustExitCode = false keepBackup = false
последняя строчка отменяет сохранение backup-файлов в директории репозитория.

3) Создадим конфликт при слиянии двух веток (см. пример с использованием DiffMerge).
git difftool master new // сравним две ветви

Для разрешения конфликта при слиянии веток, воспользуемся командой
git mergetool

Веб-мастерам или владельцам сайтов часто бывает необходимо сравнить два файла по содержимому. Из этой статьи вы узнаете как сравнить два файла между собой. Здесь описаны все известные мне способы для сравнения текстовых файлов и скрипты (html, css, php и так далее).

Способ 1. Meld

Meld - графический инструмент для получения различий и слияния двух файлов, двух каталогов. Meld - визуальный инструмент сравнения и объединения файлов и каталогов для Linux. Meld ориентирован, в первую очередь, для разработчиков. Однако он может оказаться полезным любому пользователю, нуждающемуся в хорошем инструменте для сравнения файлов и директорий.

В Meld вы можете сравнивать два или три файла, либо два или три каталога. Вы можете просматривать рабочую копию из популярных систем контроля версий, таких, таких как CVS, Subversion, Bazaar-NG и Mercurial. Meld представлен для большинства linux дистрибутивов (Ubuntu, Suse, Fedora и др.), и присутствует в их основных репозиториях.

# aptitude install meld

Способ 2. Сравнение содержимого двух файлов в программе WinMerge.

Бесплатная программа WinMerge позволяет сравнивать не только содержимое файлов, она также сравнивает содержимое целых папок. WinMerge является Open Source инструментом сравнения и слияния для Windows. WinMerge может сравнивать как файлы, так и папки, отображая различия в визуальной текстовой форме, которые легко понять и обработать.

После установки, открываете пункт меню «Файл» - «Открыть». Выбираете файлы для сравнения. Для этого нажимаете на кнопку «Обзор» и выбираете файл. Выбрав файлы, нажимаете на кнопку «ОК».

В WinMerge можно также редактировать файлы. После закрытия окна сравнения, программа предложит сохранить изменения в файлах.

Способ 3. diff

diff - утилита сравнения файлов, выводящая разницу между двумя файлами.

    Для сравнения каталогов используйте эту команду: $ diff -qr < current-directory> < backup-directory>

Способ 4. Kompare

Kompare - отображает различия между файлами. Умеет сравнивать содержимое файлов или каталогов, а также создавать, показывать и применять файлы патчей. Kompare - это графическая утилита для работы с diff, которая позволяет находить отличия в файлах, а также объединять их. Написана на Qt и рассчитана в первую очередь на KDE. Вот ее основные особенности:

    Поддержка нескольких форматов diff;

    Поддержка сравнение файла linux и каталогов;

    Поддержка просмотра файлов diff;

    Настраиваемый интерфейс;

    Создание и применение патчей к файлам.

Способ 5. Сравнение файлов в программе Total Commander

В Total Commander существует инструмент сравнения файлов по содержимому, где можно не только сравнить содержимое, но и редактировать его и копировать из одного файла в другой.

После запуска Total Commander – в одной из панелей выбираете (клавиша Insert) первый файл для сравнения – во второй панели открываете папку со вторым файлом и ставим на него курсор. Вызываем программу для сравнения: "Файлы→Сравнить по содержимому".

Для внесения изменений в файл достаточно нажать на кнопку «Редактировать». В программе доступны функции копирования и отката, поиска и изменение кодировки. Если вы внесли изменения в файл, то после закрытия окна сравнения, будет предложено сохранить изменения.

Способ 6. Сравнение файлов в Notepad++

    Поддерживаемые операционные системы: Windows, возможен запуск в Linux

Notepad++ не умеет сравнивать файлы. Для появления этого функционала в Notepad++ нужно установить плагин «Compare».

Запускаете редактор – переходите в пункт меню «Плагины» - «Plugin Manager» - «Show Plugin Manager». В новом окне выбираете плагин «Compare» и жмёте кнопку «Install».

После установки плагина откройте два файла и выбирите меню «Плагины» - «Compare» - «Compare (Alt+D)». Результат сравнения файлов будет представлен в отдельных панелях. Напротив строк, в которых найдены отличия будет стоять предупреждающий знак.

Способ 7. Сравнение файлов с помощью командной строки Windows

Сравнение с помощью командной строки Windows (cmd.exe) не позволяет редактировать файлы, но просто сравнить содержимое файлов, используя этот способ, вы можете.

Для вызова командной строки Windows перейдите «Пуск» - «Все программы» - «Стандартные» - «Командная строка» или нажмите клавиш "Windows+R", введите cmd и нажмите клавишу Enter.

В командной строке введите команду:

fc / N путь к первому файлу путь ко второму файлу

Из-под какой бы системы мне не приходилось возиться с кодом, рано или поздно становится чересчур накладно сравнивать разные версии исходников. Здесь указаны легкие бесплатные утилитки для поиска различий в файлах под Linux, Windows и Mac. Общий формат запуска – file1 file2.

Под Windows с задачей сравнения содержимого файлов (да и каталогов, что порой не бесполезно) прекрасно справляется – WinMerge . Легкая. Не завязана ни на какие IDE. Писана на Qt и кроссплатформенна – должна запускаться и на никсах. Кроме файлов умеет сравнивать и содержимое директорий (в том числе на основе масок-регэкспов). Можно навешать дополнительных плагинов.

WinMerge – кросс-платформенная утилита для сравнения файлов и не только

Mac – opendiff. Представляет собой отдельный компонент XCode. Вполне себе запускается standalone из командной строчки. Различия подсвечивает бледно-серым, зато умеет кстати показывать стрелочками что куда добавилось. Может выполнять слияние (ключик -merge). Если кроме сравниваемых файлов, указать после ключа -ancestor общий файл-предок то сравнение будет производиться с ним. Умеет сравнивать папки.

утилита opendiff – бесплатное средство сравнения файлов на системе Mac

Linux – . Есть на всех платформах (Windows, Mac, Linux) за счет того что так-же написан на Qt. Умеет сравнивать до трех файлов или директорий. Поддерживает возможность слияние изменений, с поддержкой редактирования для ручного разрешения конфликтов.

Утилита kdiff3 – сравнение двух файлов

UPDATE 18.10.2013

Если в никсах вы работаете в Gnom’е то прекрасный выбор – meld . Интеграция с популярными системами контроля версий (Git, Subversion, и др.), инструменты для слияния – авто-слияние, редактирование с подхватыванием текущих различий “на лету”, подсветка синтаксиса. Есть порты для OS X Windows.

Ну а на крайняк (если ничего стороннего поставить нельзя) – на помощь приходит неказистый diff из под командной строки (предустановлен на nix-like-системах включая и Маки, и Солярисы). Гибкий. Можно долго и с упоением играться с настройками, чтобы получить возможность отображения различий на основе маски (-F), получать сравнение в привычных двух колонках (ключик –side-by-side) и т.п. Для объемных незнакомых файлов предпочитаю вывод в “контекстном” формате, когда отображаются не только измененные строчки, но и соседние с ними.

Для сравнивания более чем двух файлов может подойти diff3.