Diff

컴퓨터에서 diff는 두 개의 파일 간 차이에 대한 정보를 출력하는 파일 비교 유틸리티이다. 일반적으로 하나의 파일 버전과 동일한 파일의 다른 버전 간의 변경 사항을 보여주는 데 쓰인다. diff는 문서 파일의 줄 사이 변경 사항을 보여준다. 이 명령어로 만든 파일은 유닉스 계열 프로그램인 patch 명령어를 이용하여 출력물을 생성할 수 있다.

역사

diff 유틸리티는 1970년대 초에 AT&T 벨 연구소와 병합 중이던 유닉스 운영 체제 상에서 개발되었다. 최종 버전은 1974년의 유닉스 제5판에 더글라스 맥클로이(Douglas McIlroy)가 완전히 다시 쓴 판이다.

알고리즘

diff 명령은 최장 공통 부분 수열 문제를 해결하는 데 기반을 둔다.
이 문제에서 다음과 같이 두 개의 항목이 있다고 가정하자.
       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
두 개의 항목을 비교하여 추가(+ 기호로 표시)되거나 삭제(- 기호로 표시)되는 부분들은 다음과 같이 나타낸다.
       e   h i   q   k r x y
       +   - +   -   + + + +

종류

1975년 이후로 핵심 알고리즘의 개선, 명령어로의 유용한 기능 추가, 새로운 출력 포맷 설계 등이 변경 사항에 포함되었다.

편집 스크립트

-e 옵션을 이용하면 현대 버전의 diff를 통해 편집 스크립트를 만들어낼 수 있다. 결과는 이를테면 다음과 같다:
 24a

 This paragraph contains
 important new additions
 to this document.
 .
 17c
 check this document. On
 .
 8,14c
 compress anything.
 .
 0a
 This is an important
 notice! It should
 therefore be located at
 the beginning of this
 document!

 .

환경 포맷

BSD는 환경 포맷 (-c)을 추가하고 파일시스템 디렉터리 구조 리커스 기능 (-r)을 1981년 7월에 2.8 BSD에 추가하여 출시하였다. 버클리가 도입한 diff의 환경 포맷은 사소하게 변경된 소스 코드의 패치를 배포하는 데 큰 도움이 되었다.
diff -c [원본 파일] [새 파일]을 이용하면 다음과 같은 출력물을 만들어낸다:
*** /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.

통일 포맷

통일 포맷 (unidiff)은 환경 포맷의 기술적 개선을 그대로 이어받았으나 비교되는 두 파일에 대한 조그마한 diff를 만들어낸다. 통일 포맷은 -u 옵션을 사용하여 이용할 수 있다. 이 출력물은 patch 프로그램의 입력에 쓰인다.
통일 환경의 diff는 1990년 8월 웨인 데이비슨이 unidiff라는 이름으로 처음 개발하였다. 리처드 스톨만이 1개월 뒤 GNU 프로젝트의 diff 유틸리티에 통일 diff 지원을 추가하면서 1991년 1월 GNU diff 1.15에 이 기능이 들어갔다.
diff -u [원본 파일] [새 파일]을 이용하면 다음과 같은 출력물을 만들어낸다:
--- /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,16 +11,10 @@
 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.+compress anything.

 It is important to spell
-check this dokument. On+check this document. On
 the other hand, a
 misspelled word isn't
 the end of the world.
@@ -22,3 +22,7 @@
 this paragraph needs to
 be changed. Things can
 be added after it.
++This paragraph contains+important new additions+to this document.

기타

이 밖에도 sdiff과 diffmk가 존재한다.