Файл diff что это
Пользователям компьютеров часто требуется узнать, чем отличаются два файла. Может быть, один файл - это обновленная версия другого файла. Или, возможно, два файла, изначально одинаковые, были изменены разными людьми.
Команда 'diff' служит для выяснения разницы между двумя файлами, или всеми соответствующими файлами в двух директориях. 'diff' выдает различия между двумя файлами строка за строкой в любом из нескольких форматов, которые можно установить с помощью опций командной строки. Это множество различий часто называется "diff" или "patch". Для одинаковых файлов 'diff' обычно ничего не выводит; для двоичных (не-текстовых) файлов, 'diff' обычно сообщает только, что они разные.
Команда 'cmp' служит для выяснения смещений и номеров строк, по которым два файла различаются. 'cmp' может также выявить все символы, которыми два файла отличаются друг от друга. Другой способ сравнить два файла посимвольно состоит в использовании команды редактора Emacs 'M-x compare-windows'
Команда 'diff3' служит для выяснения различий между тремя файлами. Когда два человека независимо внесли изменения в один и тот же файл, 'diff3' может сообщить о различиях между оригинальной и двумя измененными версиями, и позволяет создать единый файл, который содержит изменения, сделанные обоими людьми, одновременно с предупреждением о противоречиях между ними.
Команда 'sdiff' служит для интерактивного об'единения двух файлов.
Множество отличий, произведенное программой 'diff' позволяет распространять среди других людей изменения, внесенные в текстовые файлы (такие как исходные тексты программ). Этот метод особенно полезен когда объем изменений незначителен по сравнению с размером полных файлов. Результаты работы 'diff' могут быть использованы программой 'patch' для модифицирования или восстановления копии файла. Если представить 'diff' как вычитание одного файла из другого, для получения их разности, то 'patch' - это сложение разности с первым файлом для воспроизведения второго.
Это руководство сначала описывает как создавать diff-ы (множества отличий), а далее показывает как использовать их для воспроизведения исходных файлов.
GNU 'diff' был написан Майком Хаертелом, Давидом Хайесом, Ричардом Столлманом, Лен Тауер и Полом Эггерт. Вэйн Дэвидсон придумал унифицированный формат вывода. Базовый алгоритм описан в "Нулевой алгоритм поиска отличий и его варианты" Евгением В. Майрес, 'Algorithmica(Алгоритмика)' Ч.1 Nо.2, 1986, с.251-266; и в "Программе сравненения файлов" Веббом Миллером и Евгением В. Майерсом, 'Программное обеспечение - практика и опыт' Ч.15 No.11, 1985, с. 1025-1040. Алгоритм был независимо разработан Е.Укконеном и описан в статье "Алгоритмы для приближенного сравнения строк" в 'Информации и контроле' Ч.64, 1985, с.100-118.
GNU 'diff3' был написан Рэнди Смитом. GNU 'sdiff' был написан Томасом Лорд.
GNU 'cmp' был написан Торбжорном Гранлундом и Дэвидом МакКэнзи.
'patch' был написан в основном Ларри Уоллом; GNU рассширения были написаны в основном Уэйном Дэвидсоном и Дэвидом МакКензи.
Файл с расширением DIFF-файла является файлом Difference, который записывает все способы, которыми отличаются два текстовых файла. Их иногда называют файлами Patch и используют расширение .PATCH.
Файл DIFF обычно используется разработчиками программного обеспечения, которые обновляют несколько версий одного и того же исходного кода. Поскольку файл DIFF объясняет, как разные версии отличаются, программа, использующая файл DIFF, может понять, как другие файлы должны обновляться, чтобы отражать новые изменения. Выполнение такого типа модификации одного или нескольких файлов называется латание файлы.
Некоторые исправления могут применяться к файлам, даже если обе версии были изменены. Они называются контекст diffs , унифицированные разности , или же унифицированная выдача изменения , Патчи в этом контексте связаны, но не то же самое, что и программные патчи.
Файлы DIFF, о которых идет речь в этой статье, не совпадают с файлами DIF (только с одним F ), которые могут представлять собой файлы формата обмена данными, файлы MAME CHD Diff, файлы формата цифрового интерфейса или файлы модели Torque Game Engine.
Файл ODS (что это такое и как его открыть)
Файл ODS, скорее всего, является файлом OpenDocument Spreadsheet. Вот как открыть файл ODS или преобразовать файл ODS в XLS, PDF, XLSX, CSV, DOC и т. Д.
В былые времена, на Windows, для сравнения oracle-схем (читай баз) я удовлетворялся встроенным в Quest Software TOAD сравнивателем. Он был неплох, и со своей задачей справлялся. Но пересев в linux, меня ждало разочарование. Ни один из [и так небольшого количества] инструментов не предоставляет даже половины былого комфорта. А именно, элементарное сравнение и мёржинг двух файлов (DDL, SQL, любых исходников — не суть) по несколько тысяч строк в каждом, где каждый отформатирован по-своему а реальных изменений всего-ничего, становится натуральной пыткой.
Поняв тщетность попыток найти необходимый функционал в одном инструменте, я решил поискать костыли в виде сторонних инструментов. А именно — самостоятельные сравниловки и мёржиловки ([visual] compare and merging tools). Перебрав практически все популярные инструменты, выяснилось, что очень немногие (читай почти никто) умели пропускать в сравнении двух текстовых файлов символы конца строки.
Для наглядности, поясню на примере. Допустим у нас есть 2 файла, типично старый и новый.
nFunctionResult :=
orauser.pack_util.FGetNeededValue (
in_nSomeParam => somevalue
);
dbms_output.put_line( 'Function result: ' ||
nFunctionResult);
exception
when SOME_EXCEPTION THEN
orauser.pack_util.PReportError( 'SOME_EXCEPTION' );
when OTHERS THEN
orauser.pack_util.PReportError( 'OTHER exception' );
end ;
declare
nFunctionResult NUMBER(9);
begin
nFunctionResult := orauser.pack_util.FGetNeededValue (in_nSomeParam => somevalue);
dbms_output.put_line( 'Function result: ' ||nFunctionResult);
exception
when SOME_EXCEPTION THEN
orauser.pack_util.PReportError( 'SOME_EXCEPTION' );
when OTHERS THEN
orauser.pack_util.PReportError( 'OTHER' );
end ;
Как видно пытливым человеческим глазом, суть различий файлов ora1.sql и ora2.sql в одном лишь слове и разном форматировании, но их diff абсолютно нечитаем. Вот классический результат их сравнения:
Не улучшает ситуацию и ключ «положить на все пробелы» -w:
Но ближе всех по смыслу подошла утилитка коммандной строки dwdiff. Эта небольшая обёрточка вокруг diff выдаёт ровно то, что мне нужно — различия на уровне СЛОВ. Но и без ложки дёгтя не обошлось — вывод этой утилиты своеобразен и стандартных опций для приведения разницы в diff формат не имеет:
[bugman@localhost 1]$ dwdiff -P -i ora1.sql ora2.sql
declare
nFunctionResult NUMBER(9);
begin
nFunctionResult := orauser.pack_util.FGetNeededValue (in_nSomeParam => somevalue);
dbms_output.put_line('Function result: '||nFunctionResult);
exception
when SOME_EXCEPTION THEN
orauser.pack_util.PReportError('SOME_EXCEPTION');
when OTHERS THEN
orauser.pack_util.PReportError('OTHER [-exception-]');
end;
С другой стороны, это и не мудрено, ибо стандарнтный patch имеет уровень строки, а в каком виде выводить разницу двух файлов, если они различаются по-дифовски в каждой строке? Этим вопросом я озадачился и списался с автором сей утилиты, коммрадом G.P. Halkes, результатом переписки стал небольшой костыль:
Сей враппер позволяет пользоваться в том числе и с визуальными дифферами, типа kdiff3. Сам скриптик, отточенная версия которого скоро войдёт в состав dwdiff и будет распространятся вместе с ней на радость ленивым кодерам, но кому не терпится уже сейчас опробовать его в работе, никакой магии тут нет:
P. S. Безусловно у описываемой мною проблемы существуют и другие решения. Одно из них - натравить на сравниваемые исходники какой-нить автоформатер. Но мне пришлось отказатся от этого по следующим соображениям: 1) в коллективе выработался некий coding style guide, привести в соответствие с которым любой автоформатер дело не одного даже наверное дня, тратить на это время, чтобы потом разочароваться в выборе пока нет возможности; 2) если откинуть предыдущий пункт, и просто привести копии упоминаемых файлов в какой-нибудь единый формат только для сравнивания, появляется другая задача - как спроецировать найденные различия на оригиналы?
На хабре уже было много статей о распределенных системах управления версиями (DVCS), их сравнений, а также сравнений GUI-клиентов для них. Также были обсуждения плагинов к IDE для работы с git и mercurial. Но практически не было информации об инструментах визуального сравнения и разрешения конфликтов слияния.
Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). Дабы восполнить недостаток информации на хабре, я решил написать этот мини-обзор. Как говориться — по горячим следам.
Diffuse
- GPL;
- поддержка 2-way, 3-way и n-way (произвольное количество файлов) слияния;
- подсветка синтаксиса;
- отлично работает с UTF-8;
- неограниченная глубина отмен (Undo);
- удобная навигация по коду.
- разве что, невозможность сравнивать директории.
Как конвертировать DIFF-файл
Большинство типов файлов можно запустить с помощью инструмента преобразования файлов, который будет сохранен в новом формате, но нет причин делать это с файлом DIFF.
Если ваш DIFF-файл не связан с файлом формата Difference, программа, которая открывает ваш конкретный файл, может поддерживать экспорт или сохранять его в новый формат. Если это так, этот вариант, вероятно, находится где-то в файл меню.
WinMerge
- Open Source;
- никаких проблем с кодировками;
- подсветка синтаксиса без лишних телодвижений;
- сравнение директорий.
- инструмент слияния является двусторонним, что может создавать неудобства в некоторых случаях;
- Windows only.
- GPL v2;
- двустороннее и трехстороннее слияние файлов;
- сравнение директорий;
- подсветка синтаксиса (при установленном GtkSourceView).
- для установки под Windows требуется установить Python, GTK+, Glib, GtkSourceView, что не каждому понравиться.
Git и WinMerge
1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
файл winmerge следующего содержания:
Когда Git не может автоматически объединить изменения, происходит конфликт слияния и в конфликтующий файл добавляются маркеры слияния (>>>>>>). Они необходимы для разрешения конфликта с помощью сторонних инструментов.
Рассмотрим файл readme.txt который образуется в результате выполнения слияния веток master и new в приведенном выше примере:
Мы можем открыть файл конфликтов с помощью программы WinMerge для разрешения конфликта.
После этого откроется средство двухстороннего слияния:
Исходя из описанной логики перепишем команду слияния merge_cmd следующим образом:
По сути, оба приведенных варианта эквивалентны.
2) Отредактируем .gitconfig
последняя строчка отменяет сохранение backup-файлов в директории репозитория.
3) Создадим конфликт при слиянии двух веток (см. пример с использованием DiffMerge).
У меня есть некий скрипт, который формирует diff так, как мне это нужно (определённым образом выбираются коммиты для сравнения, задаются требуемые настройки). Результат работы скрипта хотелось бы просматривать не в консоли, а в некотором GUI.
То есть мне нужен инструмент, который принимает на вход уже готовый diff-файл и просто отображает его. Главное требование — это разделять diff по файлам и отображать раздельно для каждого файла. Желательно иметь подсветку синтаксиса diff (чтобы удалённые строчки отличались от добавленных цветом, а не только знаком в начале). Также очень важно иметь возможность копировать текст из просмоторщика, хотя бы построчно.
Я думал, что подобных инструментов много. Однако, перебрав почти все утилиты из списка, выдаваемого на моей платформе командой git difftool --tool-help , смог найти требуемый режим только в программе Kompare ( cat data.diff | kompare - ).
К сожалению, Kompare не поддерживает копирование текста, можно лишь смотреть. И как пишет его разработчик, данная функциональность не появится — для этого требуется переписать вообще всё отображение.
Может есть какая-нибудь другая альтернатива для данной задачи? Ещё раз подчеркну, что мне не нужен генератор diff, нужен только просмоторщик.
Платформа: Linux (Kubuntu). Но лучше кроссплатформенный, чтобы можно было запустить ещё как минимум на Windows.
Пример использования
Допустим, имеется следующий diff-файл по именем data.diff :
cat data.diff | kompare -
Теперь запустим Midnight Commander (mc):
Таким образом видим, что программы разделяют diff-файл на кусочки, соответствующие разным файлам, отображают дерево этих файлов и позволяют переключаться между ними, просматривая изменения для каждого из них индивидуально.
TKDiff
- GPLv2;
- можно добавлять закладки для различий;
- с кодировками работает нормально;
- интерфейс менее удобен и выглядит очень бедно (см. скриншот), чем у других продуктов.
- нет подсветки синтаксиса;
- не умеет сравнивать директории.
Git и DiffMerge
1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
файл diffmerge следующего содержания:
2) Теперь добавим в файл c:/Users/swipe/.gitconfig
следующие строки:
3) Создадим конфликт и вызовем DiffMerge для его разрешения
Araxis Merge
- трехстороннее слияние;
- нет проблем с кодировками;
- подсвечивает синтаксис;
- помимо файлов, может сравнивать директории и синхронизировать их;
- хорошо работает на сравнении больших файлов (гигабайты) и больших директорий;
- генерация отчётов по результатам сравнения. (если это можно назвать плюсом).
- ShareWare;
- нет версии под Linux.
Файл AZW (что это такое и как его открыть)
Файл AZW является файлом формата Kindle eBook Format. Узнайте, как открыть .AZW-файл или преобразовать AZW-файл в другой формат.
Дополнительная справка по файлам DIFF
Патч (Unix) и статьи утилиты diff в Википедии полезны, если вам интересно узнать больше об этих типах программ.
KDiff3
- бесплатен;
- поддерживает трехстороннее слияние;
- умеет сравнивать директории;
- с различными кодировками работает нормально;
- без дополнений не подсвечивает синтаксис.
Файл NEF (что это такое и как его открыть)
Файл NEF представляет собой файл изображения Nikon Raw. Узнайте, как открыть файл .NEF или преобразовать файл NEF в другой формат файла, например JPG, DNG, PNG, PDF и т. Д.
SmartSynchronize
- трехстороннее слияние;
- нет проблем с кодировками;
- помимо файлов, может сравнивать директории.
- для коммерческого использования требуется лицензия;
- подсветка синтаксиса для языков программирования по умолчанию не предусмотрена. Не исключено, что можно как-то сделать.
Как открыть файл DIFF
Файлы DIFF можно открыть в Windows и macOS с помощью Mercurial. На странице Mercurial Wiki есть вся необходимая документация, чтобы узнать, как ее использовать. Другие программы, поддерживающие файлы DIFF, включают GnuWin и UnxUtils.
Adobe Dreamweaver также может открывать файлы DIFF, но мы предполагаем, что это было бы полезно, только если вы хотите увидеть информацию, содержащуюся в файле DIFF (если это возможно), а не на самом деле с помощью файл, как вы можете, с Mercurial. Если это все, что вам нужно сделать, также работает простой бесплатный текстовый редактор.
Если все остальное не удается, и вы все еще не можете открыть свой файл DIFF, он может быть полностью не связан с файлами Difference / Patch и вместо этого используется какой-либо другой программой. Используйте бесплатный текстовый редактор или шестнадцатеричный редактор HxD, чтобы узнать, какая программа была использована для создания этого конкретного файла DIFF. Если есть что-то полезное «за занавеской», так сказать, оно, вероятно, будет в заголовочной части файла.
Некоторые форматы файлов используют аналогичное расширение для файлов DIFF и PATCH - DIX, DIZ и PAT - всего лишь несколько примеров, но это не одно и то же. Если ваш файл DIFF не открывается с использованием каких-либо программ, упомянутых выше, вам может потребоваться проверить правильность чтения расширений.
Если одна программа на вашем компьютере пытается открыть файл DIFF, но вы предпочитаете другую установленную программу, вы можете изменить расширения файлов в Windows.
BeyondCompare
- трехстороннее слияние;
- может сравнивать файлы, директории, удаленные директории, архивы, а также MP3-файлы, изображения и др. Но последние пункты — это в принципе не нужный функционал.
- ShareWare;
- нет версии под Mac.
DiffMerge
- бесплатен;
- поддерживает трехстороннее слияние;
- умеет сравнивать директории.
- бывают проблемы при работе с кириллицей. Думаю, со временем, исправят.
- DiffMerge по умолчанию, не поддерживает подсветку синтаксиса языков программирования.
Читайте также: