**diff**  — утыліта для параўнання файлаў, якая выводзіць розніцу паміж двума файламі. Гэтая праграма парадкова выводзіць адрозненні паміж файламі (для тэкставых файлаў). Сучасныя рэалізацыі могуць параўноўваць таксама бінарныя файлы.
Вынік працы падобных утыліт параўнання файлаў часта называецца «diff», таксама распаўсюджана назва «patch», таму што выніковы файл розніцы можна выкарыстаць з праграмай patch.

Пры наяўнасці розных версій аднаго файла ўтыліта diff дазваляе адсачыць змены ў навейшай версіі адносна папярэдняй.

Гісторыя
--------

Утыліта diff была распрацавана ў пачатку 1970-х гадоў для аперацыйнай сістэмы Unix, якая была плёнам працы AT & T Bell Labs, у Мюрэй Хіл (Нью-Джэрсі). Канчатковая версія, якая распаўсюджваецца з 5й Версіяй Unix у 1974, цалкам была напісана Дугласам Макілроем.

Алгарытм
--------

Праца diff заснавана на знаходжанні  найбольшай агульнай падпаслядоўнасці (англ.: longest common subsequence, праблема LCS).
Напрыклад, у вас ёсць дзве паслядоўнасці элементаў:

```
       a b c d f g h j q z
```

```
       a b c d e f g i j k r x y z
```

і вы хочаце знайсці найбольш доўгую паслядоўнасць элементаў, якая прадстаўлена ў абедзвюх паслядоўнасцях ў аднолькавым парадку. Гэта азначае, што вы хочаце знайсці новую паслядоўнасць, якая можа быць атрымана з першай паслядоўнасці выдаленнем некаторых элементаў або з другой паслядоўнасці выдаленнем іншых элементаў. У дадзеным выпадку такой паслядоўнасцю будзе

```
       a b c d f g j z
```

Пасля атрымання найбольшай агульнай паслядоўнасці застаецца толькі невялікі крок, каб атрымаць падобны на diff вывад:

```
       e   h i   k   q r x y 
       +   — +   +   — + + +
```

Ужыванне
--------

diff выклікаецца з каманднага радка з імёнамі двух файлаў у якасці аргументаў:  diff  *original* *new*. Вынік каманды ўяўляе сабой змены, якія трэба зрабіць у зыходным файле original, каб атрымаць новы файл new. Калі *original*  і *new* — дырэкторыі, то diff аўтаматычна будзе прыменена да кожнага файла, які існуе ў абедзвюх дырэкторыях.
Ва ўсіх прыкладах ў гэтым артыкуле выкарыстоўваюцца наступныя два файлы, *original* і *new*:


|  |  |
| --- | --- |
| 
*original*:

```
This part of the
document has stayed the
same from version to
version.  It shouldn’t
be shown if it doesn’t
change.  Otherwise, that
would not be helping to
compress the size of the
changes.

This paragraph contains
text that is outdated.
It will be deleted in the
near future.

It is important to spell
check this dokument. On
the other hand, a
misspelled word isn’t
the end of the world.
Nothing in the rest of
this paragraph needs to
be changed. Things can
be added after it.
```

 | 
*new*:

```
This is an important
notice! It should
therefore be located at
the beginning of this
document!

This part of the
document has stayed the
same from version to
version.  It shouldn’t
be shown if it doesn’t
change.  Otherwise, that
would not be helping to
compress anything.

It is important to spell
check this document. On
the other hand, a
misspelled word isn’t
the end of the world.
Nothing in the rest of
this paragraph needs to
be changed. Things can
be added after it.

This paragraph contains
important new additions
to this document.
```

 |

Каманда  diff original new  стварае наступны *нармальны diff-вынік*:

```
0a1,6
> This is an important
> notice! It should
> therefore be located at
> the beginning of this
> document!
>
8,14c14
< compress the size of the
< changes.
<
< This paragraph contains
< text that is outdated.
< It will be deleted in the
< near future.
---
> compress anything.
17c17
< check this dokument. On
---
> check this document. On
24a25,28
>
> This paragraph contains
> important new additions
> to this document.
```

У гэтым традыцыйным фармаце вываду **a** азначае  *дабаўлена* (ад англ.: add),**d** —  *выдалена* (ад англ.: delete),**c** —  *зменена* (ад англ.: change).
Перад літарамі a, d або c стаяць нумары радкоў зыходнага файла, пасля іх — нумары радкоў канчатковага файла. Перад кожным радком, які быў дабаўлены, выдалены або зменены, стаяць вуглавыя дужкі.
Перадвызначана, агульныя для зыходнага і канчатковага файлаў нумары радкоў не паказваюцца. Радкі, якія былі перамешчаны, паказваюцца як дабаўленыя на сваім новым месцы і выдаленыя са свайго папярэдняга размяшчэння.

Варыянты
--------

Большасць рэалізацый diff застаюцца вонкава нязменнымі з 1975 года. Мадыфікацыі ўключаюць у сябе паляпшэнні асноўнага алгарытму, даданне новых ключоў каманды, новыя фарматы вываду. Базавы алгарытм выкладзен у кнігах *An O (ND) Difference Algorithm and its Variations* Юджына В. Майерса, і ў *A File Comparison Program* Вэбба Міллера ды Майерса.
Алгарытм быў незалежна адкрыт і апісан ў *Algorithms for Approximate String Matching* Е. Укканенам
Першыя версіі праграмы diff былі распрацаваны для параўнання радкоў тэкставых файлаў, у якіх у якасці раздзяляльніка радкоў выкарыстоўваецца сімвал  новага радка. У 1980-х, падтрымка бінарных файлаў прывяла да змен у алгарытме работы і рэалізацыі праграмы.

### Кантэкстны фармат

У BSD версіі 2.8 (выпушчанай у ліпені 1981 года) з’явіўся *кантэкстны фармат* (-c ).

У кантэкстным фармаце змененыя радкі паказваюцца разам з незакранутымі радкамі да і пасля змененага фрагмента. Устаўка любой колькасці незакранутых радкоў падае *кантэкст* для патча.  *Кантэкст*, які складаецца з незакранутых радкоў, служыць спасылкай для вызначэння становішча змененага фрагмента ў мэтавым файле, нават калі нумары змененых радкоў у зыходным і мэтавым файлах не супадаюць.

Вынік каманды diff -c original new:

```
*** /path/to/original ''timestamp''
--- /path/to/new ''timestamp''
***************
*** 1,3 ****
--- 1,9 ----
+ This is an important
+ notice! It should
+ therefore be located at
+ the beginning of this
+ document!
+
  This part of the
  document has stayed the
  same from version to
***************
*** 5,20 ****
  be shown if it doesn’t
  change.  Otherwise, that
  would not be helping to
! compress the size of the
! changes.
!
! This paragraph contains
! text that is outdated.
! It will be deleted in the
! near future.

  It is important to spell
! check this dokument. On
  the other hand, a
  misspelled word isn’t
  the end of the world.
--- 11,20 ----
  be shown if it doesn’t
  change.  Otherwise, that
  would not be helping to
! compress anything.

  It is important to spell
! check this document. On
  the other hand, a
  misspelled word isn’t
  the end of the world.
***************
*** 22,24 ****
--- 22,28 ----
  this paragraph needs to
  be changed. Things can
  be added after it.
+
+ This paragraph contains
+ important new additions
+ to this document.

```

Гл. таксама
-----------

* cmp
* comm
* diff3
* Kompare
* kdiff3
* Meld
* Microsoft File Compare
* rsync
* tkdiff
* wdiff — абгортка для diff для параўнання файлаў па словах
* WinMerge
* Дэльта-кадаванне
* Найбольшая агульная падпаслядоўнасць
* Адлегласць Левенштэйна

Зноскі
------

1. ↑  David MacKenzie, Paul Eggert, and Richard Stallman (1997). *Comparing and Merging Files with GNU Diff and Patch*. ISBN 0-9541617-5-0.
2. ↑  E. Myers (1986). "An O(ND) Difference Algorithm and Its Variations". *Algorithmica* **1** (2): 251–266.
3. ↑  Webb Miller and Eugene W. Myers (1985). "A File Comparison Program". *Software — Practice and Experience* **15** (11): 1025–1040.
4. ↑  E. Ukkonen (1985). "Algorithms for Approximate String Matching". *Information and Control* **64**: 100–118.

Спасылкі
--------

* Пакет GNU diffutils уключае ў сябе diff. Распаўсюджваецца пад GNU General Public License.
* diffutils для Win32 — частка GnuWin32
* Online-інтэрфейс да diff Архівавана 26 студзеня 2007. (англ.)
* java-diff — Бібліятэка diff, рэалізаваная на Java
* Алгарытм diff на C# — Зыходны код алгарытма diff і яго варыянтаў на C#

| ⛭Стандартныя праграмы UNIX (усе праграмы) |
| --- |
| Файлавыя сістэмы | chroot · dd · df · fdisk · fsck · mkisofs · mkswap · mount · umount · rehash |
| Файлы і каталогі | cat · chattr · cd · chmod · chown · chgrp · cksum · cmp · cp · diff · du · file · fuser · ln · ls · lsof · mkdir · mv · od · pwd · rm · rmdir · split · touch |
| Працэсы | at · cron · exit · kill · killall · nice · nohup · pgrep · pidof · pkill · ps · renice · sleep · time · top · wait · watch |
| Карыстальнікі | env · finger · id · last · logname · mesg · passwd · su · sudo · uptime · w · wall · who · whoami · write |
| Сетка | ftp · host · ifconfig · netcat · netstat · nmap · nslookup · ping · rlogin · SSH · traceroute · wget |
| Тэксты | AWK · comm · cut · ed · ex · expand · unexpand · fmt · head · iconv · join · less · more · paste · pr · sed · sort · tac · tail · tr · uniq · wc · xargs |
| Камандны радок | alias · basename · bash · bind · dirname · echo · expr · false · printf · test · true · unset |
| Пошук | find · grep · strings · whereis · which |
| Рознае | banner · bc · cal · date · help · lp · man · Xhistory · size · tee · uname · yes · reboot |

| ⛭Сістэмы кіравання версіямі (катэгорыя) |
| --- |
| Толькі лакальныя | RCS ·  SCCS |  |
| Кліент-серверныя | CMVC ·  CVS ·  Perforce ·  Rational ClearCase (1992) ·  SourceGear Vault ·  Subversion (SVN) ·  Team Foundation Server ·  Visual SourceSafe |
| Размеркаваныя | Bazaar ·  Darcs ·  Fossil ·  Git ·  Mercurial ·  TeamWare |
| Галіны ·  Дэльта-кадаванне ·  Форк |