맨위로가기

Diff

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

diff는 1974년 더글러스 매킬로이가 개발한 텍스트 파일 비교 유틸리티이다. 텍스트 파일 간의 차이점을 식별하고 변경 사항을 표시하는 데 사용되며, 래리 월이 개발한 patch 유틸리티와 함께 활용성을 높였다. 최장 공통 부분 수열(LCS) 알고리즘을 기반으로 하며, 파일의 추가, 삭제, 변경된 줄을 효율적으로 찾아낸다. diff 명령어는 다양한 옵션을 제공하여 차이점 표시 방식을 사용자 정의할 수 있으며, 문맥 형식과 통합 형식을 통해 변경 사항을 효과적으로 보여준다. diffutils 패키지에는 파일 비교를 위한 다양한 유틸리티가 포함되어 있으며, GUI 기반 및 웹 기반의 파일 비교 도구도 존재한다.

더 읽어볼만한 페이지

  • 1974년 소프트웨어 - CP/M
    CP/M은 게리 킬달이 개발한 8비트 마이크로컴퓨터용 운영체제로, 플로피 디스크 기반의 다양한 하드웨어 플랫폼에서 작동하며, 뛰어난 이식성과 방대한 소프트웨어 라이브러리를 바탕으로 1980년대 초반 널리 사용되었으나, MS-DOS의 부상으로 시장 점유율을 잃었지만 MS-DOS와 초기 윈도우 운영체제에 영향을 미쳤다.
  • 1974년 소프트웨어 - IBM 시스템 R
  • 패턴 매칭 - 퇴각검색
    퇴각검색은 해를 찾기 위해 트리 구조로 표현된 후보들을 깊이 우선 탐색 방식으로 탐색하며, 유효하지 않은 후보는 가지치기하여 탐색 시간을 단축하는 알고리즘이다.
  • 패턴 매칭 - 정규 표현식
    정규 표현식은 특정 패턴 문자열 집합을 표현하는 식으로, 스티븐 클레이니가 고안하고 켄 톰슨이 텍스트 편집기에 도입한 후 펄을 거쳐 현재 다양한 프로그래밍 언어와 환경에서 텍스트 처리 및 데이터 검증에 널리 쓰인다.
  • 형식 언어 - 문자열
    문자열은 사람이 읽을 수 있는 텍스트를 저장하고 정보를 전달하거나 받는 데 사용되는 순서가 있는 문자들의 시퀀스로, 다양한 형태의 데이터를 표현하며 유한한 길이를 가지고, 프로그래밍 언어에서 기본 또는 복합 자료형으로 제공되고, 문자 집합과 인코딩 방식에 따라 표현 방식이 달라진다.
  • 형식 언어 - 튜링 기계
    튜링 기계는 앨런 튜링이 제시한 계산 모델로, 테이프 위에서 기계적으로 작동하며, 유한한 상태, 테이프, 헤드, 명령 표를 통해 작동하고, 계산 가능성과 알고리즘의 한계를 연구하는 데 사용된다.
Diff - [IT 관련 정보]에 관한 문서
개요
유형파일 비교 유틸리티
개발자더글러스 매클로이 (AT&T 벨 연구소)
최초 릴리스1974년 6월
프로그래밍 언어C
운영 체제유닉스, 유닉스 계열, V, Plan 9, Inferno
플랫폼크로스 플랫폼
장르명령어
라이선스Plan 9: MIT 라이선스

2. 역사

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

diff는 스티븐 C. 존슨의 GECOS 상의 비교 프로그램과 마이크 레스크의 프로그램의 영향을 받았다. 초기에는 소프트웨어 코드 및 기술 문서의 변경 사항 비교, 프로그램 디버깅 출력 확인, 파일 시스템 목록 비교, 컴퓨터 어셈블리 코드 분석 등 일반적인 용도로 사용되었다.

diff는 개념적으로 1960년에 나타난 하이퍼텍스트 프로젝트인 자나두 계획(Project Xanadu)의 영향을 받았다. 자나두 계획은 "상호 참조 윈도우" 기능에 필요한 이력판 관리 및 추적 개념을 제시했으며, 파일의 차이점 제시는 더 넓은 용어인 "트랜스크루전 (transclusion)"에 포함되었다.

2. 1. 초기 개발

유닉스 운영 체제 상에서 1970년대 초 벨 연구소에서 개발된 diff 유틸리티는, 1974년 유닉스 제5판에 더글라스 맥클로이(Douglas McIlroy)가 완전히 다시 쓴 버전이 최초로 공개되었다.[4] 이 버전은 제임스 W. 헌트와 맥클로이가 1976년에 공동으로 작성한 논문에서 발표되었으며, 헌트-시만스키 알고리즘으로 알려진 알고리즘이 사용되었다.[5]

맥클로이의 작업 이전에는 스티븐 C. 존슨의 GECOS 상의 비교 프로그램과 마이크 레스크의 프로그램이 영향을 주었다. 는 유닉스에서 개발되었으며, 와 유사하게 행 단위 변경 사항을 생성하고 꺾쇠 괄호(">" 및 "<")를 사용하여 행 삽입 및 삭제를 표시했다. 그러나 초기 프로그램들의 휴리스틱은 신뢰성이 낮았다. diff 도구의 잠재적 유용성은 맥클로이가 PDP-11의 하드웨어 제약 내에서 작동하는 강력한 도구를 연구하도록 이끌었다. 이 연구는 알프레드 아호, 엘리엇 핀슨, 제프리 울먼, 해럴드 S. 스톤을 포함한 벨 연구소의 동료들과의 협력을 통해 진행되었다.

유닉스의 라인 편집기 사용은 가 "편집 스크립트"를 생성하는 기능을 제공하게 했다. 이 스크립트를 통해 원본 파일과 함께 를 사용하여 수정된 파일을 재구성할 수 있었고, 이는 파일의 여러 버전을 유지하는 데 필요한 보조 기억 장치를 크게 줄였다. 맥클로이는 다양한 출력 형식을 고려했지만, 가 명령에 의해 허용되는 구문 및 역순 입력을 생성하도록 하는 것이 더 간결하다고 판단했다.

1985년, 래리 월은 별도의 유틸리티인 patch를 만들어 의 출력을 사용하여 파일을 수정하고 컨텍스트를 일치시키는 기능을 추가했다.[6][7][8]

초기에 는 소프트웨어 코드 및 기술 문서의 변경 사항 비교, 프로그램 디버깅 출력 확인, 파일 시스템 목록 비교 등 일반적인 용도로 사용되었다. 를 대상으로 한 출력은 파일에 대한 일련의 수정 사항을 압축하여 제공하기 위해 고안되었다. 1970년대 후반, 소스 코드 제어 시스템 (SCCS)과 함께 의 편집 스크립트를 저장하여 버전 보관 기능이 등장했다.

2. 2. 발전 과정

1984년, 래리 월은 patch 유틸리티를 개발하여 ''mod.sources'' 및 ''net.sources'' 뉴스 그룹에 소스 코드를 공개했다.[6][7][8] 이 프로그램은 diff의 출력을 사용하여 파일을 수정하고 컨텍스트를 일치시키는 기능을 갖추었다.

1987년 발행된 X/Open Portability Guide 2호에 diff가 포함되었다. 컨텍스트 모드는 POSIX.1-2001(6호)에, 통합 모드는 POSIX.1-2008(7호)에 추가되었다.[9]

2. 3. 자나두 계획과의 연관성 (선택적)

diff는 개념적으로 자나두 계획(Project Xanadu)의 영향을 받았다. 자나두 계획은 1960년에 등장한 하이퍼텍스트 프로젝트로, "상호 참조 윈도우" 기능에 필요한 이력판 관리 및 추적 개념을 제시했다. 파일의 차이점 제시는 이 기능의 일부로, 더 넓은 용어인 "트랜스크루전 (transclusion)"에 포함되었다. 트랜스크루전은 어떤 문서가 다른 문서 또는 다른 버전의 일부에 포함되는 것을 의미한다.

3. 알고리즘

diff영어 명령어는 최장 공통 부분 수열 문제를 해결하는 알고리즘을 기반으로 작동한다.[5]

이는 두 항목을 비교하여 추가(+)되거나 삭제(-)되는 부분을 표시하는 방식으로 이루어진다. 예를 들어, 다음과 같은 두 항목이 있을 때:


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


두 항목을 비교하여 변경 사항을 표시하면 다음과 같다.

e h i q k r x y

+ - + - + + + +

3. 1. 최장 공통 부분 수열 (LCS)

diff 명령은 최장 공통 부분 수열 문제를 해결하는 데 기반을 둔다.[5]

두 개의 항목 시퀀스가 주어졌을 때:

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 q k r x y

+ - + - + + + +

4. 사용법

`diff` 명령어는 명령 줄에서 두 개의 파일 이름이나 디렉터리 이름을 지정하여 사용한다.[52] `diff` 명령어는 기본적으로 두 파일에서 내용이 완전히 일치하는 줄은 출력 결과에 나타내지 않는다.[52]

`diff [원본 파일 이름 또는 원본 디렉터리 이름] [새 파일 이름 또는 새 디렉터리 이름]`과 같이 명령어를 입력하면, 원본 파일이 새 파일로 어떻게 변경되었는지 확인할 수 있다. 디렉터리를 지정하면, `diff`는 두 디렉터리에 공통으로 존재하는 각 파일의 차이점을 분석한다. `-r` 옵션을 추가하면 하위 디렉터리까지 모두 검색하여 비교한다.[52]

전통적인 출력 형식에서 `a`는 추가(added), `d`는 삭제(deleted), `c`는 변경(changed)을 의미한다.[10] 원본 파일의 줄 번호는 `a`/`d`/`c` 앞에, 수정되는 파일의 줄 번호는 뒤에 표시된다.

4. 1. 기본 사용법

`diff` 명령어는 명령 줄에서 두 개의 파일 이름 또는 디렉터리 이름을 지정하여 사용한다.[52]

```

diff [원본 파일 이름 또는 원본 디렉터리 이름] [새 파일 이름 또는 새 디렉터리 이름]

```

이는 원본 파일이 새 파일이 되는 변경 사항을 나타낸다. 디렉터리를 지정할 경우 `diff`는 두 디렉터리에 존재하는 각 파일의 차이점을 분석한다. `-r` 옵션을 사용하면 하위 디렉터리까지 재귀적으로 검색한다.[52]

원본 파일과 새 파일의 내용이 다음과 같다고 가정한다.

원본 파일새 파일
|



이 경우 `diff` 명령은 두 파일의 내용을 비교하여 다음과 같은 차이점을 출력한다.[52]

```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`'''는 ''added''(추가)를, '''`d`'''는 ''deleted''(삭제)를, '''`c`'''는 ''changed''(변경)을 의미한다. 원본 파일의 줄 번호는 `a`/`d`/`c` 앞에, 수정되는 파일의 줄 번호는 뒤에 표시된다.[10]

기본적으로 두 파일에서 내용이 완전히 일치하는 줄은 표시되지 않는다.[52]

4. 2. 출력 결과 해석

diff 명령어의 출력 결과는 원본 파일과 새 파일을 비교하여 변경된 내용을 보여준다. 출력 형식은 전통적인 방식과 현대적인 방식이 있으며, 여기서는 전통적인 출력 방식을 중심으로 설명한다.

diff 출력은 다음과 같은 기호를 사용하여 변경 사항을 나타낸다.[52][10]

  • '''a''' (added): 새 파일에 추가된 내용을 나타낸다.
  • '''d''' (deleted): 원본 파일에서 삭제된 내용을 나타낸다.
  • '''c''' (changed): 원본 파일과 새 파일 간에 내용이 변경된 부분을 나타낸다.


각 기호 앞에는 원본 파일의 줄 번호가 표시되고, 뒤에는 새 파일의 줄 번호가 표시된다. 예를 들어, "0a1,6"은 원본 파일에는 없지만 새 파일의 1번째 줄부터 6번째 줄까지 추가되었다는 의미이다. "8,14c14"는 원본 파일의 8번째 줄부터 14번째 줄까지의 내용이 새 파일의 14번째 줄 내용으로 변경되었다는 것을 의미한다. "17c17"은 원본 파일의 17번째 줄이 새 파일의 17번째 줄로 변경되었음을 나타낸다.

변경 사항은 꺾쇠 괄호(`>` 또는 `<`)로 표시된다. `>` 기호는 새 파일에 추가되거나 변경된 내용을, `<` 기호는 원본 파일에서 삭제되거나 변경된 내용을 나타낸다.

다음은 'original'과 'new'라는 두 파일을 비교한 예시이다.

원본 파일 (original)새 파일 (new)



`diff original new` 명령을 실행하면 다음과 같은 출력이 나타난다.

```text

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.

```

위 출력 결과에 대한 해석은 다음과 같다.

  • 0a1,6: 새 파일의 1~6번째 줄이 추가되었다.
  • 8,14c14: 원본 파일의 8~14번째 줄이 새 파일의 14번째 줄로 변경되었다.
  • 17c17: 원본 파일의 17번째 줄("dokument")이 새 파일의 17번째 줄("document")로 변경되었다.
  • 24a25,28: 새 파일의 24번째 줄 이후에 25~28번째 줄이 추가되었다.


이와 같이 diff 출력 결과를 통해 두 파일 간의 차이점을 한눈에 파악할 수 있다.

5. 출력 형식의 종류

diff 명령어는 다양한 출력 형식을 제공하여 사용자가 필요에 맞게 결과를 확인할 수 있도록 돕는다. 주요 출력 형식은 다음과 같다.


  • 편집 스크립트 (-e 옵션): 편집 스크립트를 생성한다.
  • 문맥 형식 (-c 옵션): BSD에서 개발되었으며, 변경된 내용과 함께 주변 문맥을 보여준다. 패치 프로그램의 입력으로 사용될 수 있다.
  • 통합 형식 (-u 옵션): 웨인 데이비슨이 개발하고 리처드 스톨먼GNU 프로젝트에 추가한 형식으로, 원본과 수정본을 나란히 표시하여 더 작은 diff를 만든다. 소프트웨어 개발자 사이에서 패치를 주고받을 때 가장 널리 사용된다.


이 외에도 diff는 여러 파일의 차이점을 하나로 합치는 기능을 제공하며, 1980년대에는 바이너리 파일 비교 기능도 추가되었다.

버클리 소프트웨어 배포판은 컨텍스트 형식(-c)과 파일 시스템 디렉터리 탐색 기능(-r)을 diff에 추가하여 (1981년 7월, 2.8BSD) 소스 코드 패치 배포를 용이하게 했다.

diff3는 세 파일 비교를, Wdiff는 단어/구절 단위 변경 사항 확인을, Spiff는 부동 소수 정밀도 차이나 공백/주석 무시 비교를 지원한다.[49],[50]

5. 1. 편집 스크립트 (-e 옵션)

ed 스크립트는 최신 버전의 diff에서 `-e` 옵션을 사용하여 생성할 수 있다. 다음은 그 예시이다.

24'''a'''

''이 단락은''

''이 문서에''

''중요한 새로운 추가 사항을 포함합니다.''

.

17'''c'''

''이 문서를 확인하세요. On''

.

11,15'''d'''

0'''a'''

''이것은 중요한''

''알림입니다! 따라서''

''이 문서의 시작 부분에 있어야 합니다!''

.

`ed`를 사용하여 파일 ''original''의 내용을 파일 ''new''의 내용으로 변환하려면 이 diff 파일에 두 줄을 추가해야 한다. 한 줄은 `w` (쓰기) 명령어를 포함하고, 다른 한 줄은 `q` (종료) 명령어를 포함한다 (예: `printf "w\nq\n" >> mydiff`). 여기에서 diff 파일의 이름을 ''mydiff''로 지정했으며 `ed -s original < mydiff`를 실행하면 변환이 수행된다.

5. 2. 문맥 형식 (-c 옵션)

BSD는 1981년 7월에 2.8 BSD에 문맥 형식 (-c)과 파일시스템 디렉터리 구조를 재귀적으로 탐색하는 기능 (-r)을 추가했다.[1] 버클리가 도입한 diff의 환경 포맷은 소스 코드의 사소한 변경 사항을 패치로 배포하는 데 큰 도움이 되었다.[1]

문맥 형식은 변경된 내용과 함께 주변 문맥(변경되지 않은 줄)을 보여준다. 변경되지 않은 줄은 두 파일 간에 변경되지 않은 줄로 구성되며, 수정된 파일에서 줄의 위치를 찾고, 줄 번호가 일치하는지 여부와 관계없이 변경 사항을 적용할 위치를 찾는 데 사용된다.[1] 문맥 형식은 사람이 읽기 쉽고 패치를 적용할 때의 신뢰성을 높이며, 패치 프로그램의 입력으로 사용할 수 있다.[1]

변경 덩어리(hunk) 위아래에 표시되는 변경되지 않은 줄의 수는 사용자가 정의할 수 있으며, 0으로도 설정할 수 있지만, 일반적으로 3줄이 기본값이다. 덩어리의 변경되지 않은 줄의 문맥이 인접한 덩어리와 겹치면 diff는 변경되지 않은 줄을 중복하지 않고 덩어리를 단일 덩어리로 병합한다.[1]

`!`는 두 파일에서 일치하는 줄 간의 변경을, `+`는 줄의 추가를, `-`는 줄의 삭제를 나타낸다. 빈 공백은 변경되지 않은 줄을 나타낸다.[1] 패치의 시작 부분에는 전체 경로와 타임 스탬프를 포함한 파일 정보가 탭 문자로 구분되어 있다.[1] 각 덩어리의 시작 부분에는 파일의 해당 변경 사항에 적용되는 줄 번호가 있다.[1] 세 개의 별표 집합 사이에 나타나는 숫자 범위는 원래 파일에, 세 개의 대시 집합은 새 파일에 적용된다.[1] 덩어리 범위는 각 파일의 시작 및 종료 줄 번호를 지정한다.[1]

`diff -c original new` 명령을 실행하면 다음과 같은 출력이 생성된다.[1]


  • ** /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
***
* 8,20 **

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.

  • -- 14,21 ----

compress the size of the

changes.

It is important to spell

! check this document. On

the other hand, a

misspelled word isn't

the end of the world.
***
* 22,24 **

  • -- 23,29 ----

this paragraph needs to

be changed. Things can

be added after it.

+

+ This paragraph contains

+ important new additions

+ to this document.


5. 3. 통합 형식 (-u 옵션)

통일 형식(''unidiff'')은 문맥 형식에서 개선된 형식으로, 원본 텍스트와 새 텍스트를 나란히 표시하여 diff를 더 작게 만든다. `diff` 명령어에 `-u` 옵션을 붙여 사용하며,[11][12] patch 프로그램의 입력으로 자주 쓰인다.[12] 많은 프로젝트에서 통일 형식으로 diff를 제출하도록 요구하기 때문에, 소프트웨어 개발자 사이에서 패치를 주고받을 때 가장 널리 사용되는 형식이다.

통일 형식 diff는 1990년 8월 웨인 데이비슨이 unidiff라는 이름으로 처음 개발했다.[51] 리처드 스톨먼은 한 달 뒤 GNU 프로젝트의 diff 유틸리티에 통일 diff 지원을 추가했고, 1991년 1월 GNU diff 1.15 버전에 이 기능이 포함되었다.

통일 형식은 문맥 형식처럼 두 줄의 헤더로 시작한다. 원본 파일은 "---"로, 새 파일은 "+++"로 시작한다. 그 뒤에는 하나 이상의 '''수정 덩어리(change hunks)'''가 오는데, 파일 내에서 서로 다른 부분을 담고 있다. 변경되지 않은 줄은 공백 문자로, 추가된 줄은 더하기 기호로, 삭제된 줄은 빼기 기호로 시작한다.

각 덩어리는 '''범위 정보(range information)'''로 시작하고, 바로 뒤에 추가된 줄, 삭제된 줄, 문맥 전후의 줄이 이어진다. 범위 정보는 "@@"로 둘러싸여 있으며, 문맥 형식에서 두 줄로 표현하던 것을 한 줄로 합쳐서 나타낸다. 범위 정보의 형식은 다음과 같다.

`@@ -l,s +l,s @@ optional section heading`

덩어리 범위 정보는 두 개의 덩어리 범위를 포함한다. 원본 파일의 덩어리 범위는 빼기(-) 기호로, 새 파일의 덩어리 범위는 더하기(+) 기호로 시작한다. 각 덩어리 범위는 ''l,s'' 형식을 따르는데, ''l''은 시작 줄 번호이고, ''s''는 각 파일에서 수정 덩어리가 적용되는 줄의 개수이다. GNU diff의 많은 버전에서는 ''s''가 1일 때 쉼표와 ''s'' 값을 생략할 수 있다.

원본 파일의 덩어리 범위는 문맥, 삭제(변경 포함) 덩어리 줄의 합이어야 한다. 새 파일의 덩어리 범위는 문맥, 추가(변경 포함) 덩어리 줄의 합이어야 한다. 덩어리 크기 정보가 덩어리 안의 줄 개수와 맞지 않으면, diff는 유효하지 않은 것으로 판단되어 거부된다.

덩어리 범위 뒤에는 해당 덩어리가 속한 섹션이나 함수의 이름이 올 수 있다. 이렇게 하면 diff를 읽기 쉬워진다. GNU diff에서는 정규 표현식을 사용하여 헤딩을 인식한다.[13]

한 줄이 수정된 경우, 삭제와 추가로 표시된다. 원본 파일과 새 파일의 덩어리가 같은 덩어리에 나타나므로, 이러한 변경 사항은 서로 인접하게 표시된다.[14]

`diff -u [원본 파일] [새 파일]` 명령을 실행하면 통합 형식의 출력을 얻을 수 있다.

6. 확장 및 관련 프로그램

diff의 기본 구현 사양은 1975년 이후 크게 바뀌지 않았지만, 알고리즘 개선, 기능 추가, 새로운 출력 형식 설계 등의 발전이 있었다. 초기 diff 프로그램은 개행 문자로 구분되는 텍스트 파일의 행 단위 비교를 위해 설계되었으나, 1980년대에는 바이너리 파일에 대한 지원도 추가되었다.

버클리 소프트웨어 배포판(2.8BSD, 1981년 7월 출시)에서는 컨텍스트 형식(-C)과 디렉토리 구조 탐색 기능(-r)이 추가되었다. 컨텍스트 형식은 소스 코드의 미세한 변경 사항을 패치 형태로 배포하는 것을 가능하게 했다.

diff3 명령어는 파일을 다른 두 파일과 비교하는 기능을 제공하며, 주로 merge 프로그램이나 버전 관리 시스템에서 내부적으로 사용된다. Wdiff는 텍스트 내의 단어 단위·구절 단위 변경을 보여주는 도구이며[49], Spiff는 부동 소수 정밀도 자릿수 차이나 프로그램 파일의 공백, 주석 등을 무시하고 비교할 수 있다[50]

후처리 프로그램인 '''sdiff'''는 diff 항목을 나란히 출력하고, '''diffmk'''는 인쇄 문서에 변경 사항 마크를 삽입한다. 이들은 1981년 이전에 벨 연구소 밖에서 개발되었다.

6. 1. 다양한 확장

일부 프로그램과 특정 환경에서 사용되고 이해되는 diff 형식에 대한 수정 및 확장이 있다. 예를 들어, Subversion과 같은 일부 개정 관리 시스템은 diff의 헤더 섹션에서 타임스탬프 대신 또는 타임스탬프 외에 버전 번호, "working copy" 또는 기타 주석을 지정한다.

일부 도구는 여러 다른 파일에 대한 diff를 하나로 병합할 수 있으며, 수정된 각 파일에 대한 헤더를 사용한다. 헤더는 다음과 같은 형태일 수 있다.

Index: path/to/file.cpp

줄 바꿈으로 끝나지 않는 파일의 특수한 경우는 처리되지 않는다. unidiff 유틸리티와 POSIX diff 표준은 이 유형의 파일을 처리하는 방법을 정의하지 않는다. (실제로, 이러한 파일은 엄격한 POSIX 정의에 따라 "텍스트" 파일이 아니다.[15]) GNU diff와 git는 "\ No newline at end of file" (또는 번역된 버전)이라는 진단 메시지를 생성하지만, 이 동작은 이식성이 없다.[16] GNU patch는 이 경우를 처리하지 않는 것으로 보이지만, git-apply는 처리한다.[17]

patch 프로그램은 구현별 diff 출력을 반드시 인식하지는 않는다. 그러나 GNU patch는 git 패치를 인식하고 약간 다르게 동작하는 것으로 알려져 있다.[18]

6. 2. 관련 프로그램

GNU의 Diffutils 패키지에는 다음과 같은 프로그램들이 포함되어 있다.[22]

  • cmp
  • diff
  • diff3
  • patch


후처리 프로그램인 '''sdiff'''와 '''diffmk'''는 각각 차이점을 나란히 표시하거나 인쇄된 문서에 변경 표시를 렌더링한다. 이들은 1981년 또는 그 이전에 벨 연구소에서 개발되었다.

Diff3는 두 파일을 비교하여 한 파일에서 다른 두 파일로 변경된 사항을 조정한다. 원래 Paul Jensen이 두 사람이 공통 소스를 편집하면서 발생한 변경 사항을 조정하기 위해 구상했다. 또한 병합을 위해 RCS와 같은 개정 관리 시스템에서도 사용된다.[23]

Emacs는 패치 파일에 대한 대화형 편집 및 병합 기능을 결합한 사용자 인터페이스에서 패치가 제공하는 변경 사항을 보여주는 Ediff를 가지고 있다.

Vim은 '''vimdiff'''를 제공하여 두 개에서 여덟 개의 파일을 비교하고, 차이점을 색상으로 강조 표시한다.[24] 역사적으로 diff 프로그램을 호출했지만, 최신 vim은 git의 xdiff 라이브러리(LibXDiff) 코드 포크를 사용하여 속도와 기능이 향상되었다.[25]

GNU Wdiff[26]는 단어 줄 바꿈 또는 열 너비가 다른 경우에도 작성된 언어의 텍스트 문서에서 변경된 단어 또는 구문을 보여주는 diff의 프론트 엔드이다.

colordiff는 'diff'의 Perl 래퍼이며 동일한 출력을 생성하지만 추가 및 삭제된 비트를 색상으로 표시한다.[27] diff-so-fancy 및 diff-highlight는 최신 유사 프로그램이다.[28] "delta"는 변경 사항과 기본 코드를 동시에 강조 표시하는 Rust 재작성본이다.[29]

'''Patchutils'''에는 컨텍스트 diff 및 통합 diff를 결합, 재정렬, 비교 및 수정하는 도구가 포함되어 있다.[30]

7. 다른 파일 비교 도구

diff 외에도 cmp, comm, diff3, Kompare, tkdiff, WinMerge(윈도), UCC, meld 등 다양한 파일 비교 도구들이 있다.[1] [http://www.diffchecker.com/ Diff Checker], [https://web.archive.org/web/20110820052638/http://www.aldram.com/Diff.aspx Web Diff], [http://prettydiff.com/ Pretty Diff]와 같이 웹 브라우저 상에서 바로 사용할 수 있는 도구들도 존재한다.[1]

7. 1. 텍스트 기반 비교 도구

도구 이름플랫폼비고
cmp유닉스[1]
comm유닉스[1]
diff3유닉스[1]
Kompare[1]
tkdiff[1]
WinMerge윈도[1]
UCC[1]
meld[1]
[http://www.diffchecker.com/ Diff Checker]웹 기반[1]
[https://web.archive.org/web/20110820052638/http://www.aldram.com/Diff.aspx Web Diff]웹 기반[1]
[http://prettydiff.com/ Pretty Diff]웹 기반[1]


7. 2. GUI 기반 비교 도구

참조

[1] 웹인용 "Binary Files and Forcing Text Comparison" in ''Comparing and Merging Files with GNU Diff and Patch'' https://www.gnu.org/[...] 2007-04-28
[2] 웹인용 diff http://catb.org/jarg[...] null
[3] 서적 Standard for Information Technology—Portable Operating System Interface (POSIX) Base Specifications, Issue 7 2008-09-26
[4] URL https://minnie.tuhs.[...]
[5] 논문 An Algorithm for Differential File Comparison http://www.cs.dartmo[...] 2015-05-06
[6] 뉴스그룹 A patch applier--YOU WANT THIS!!! https://groups.googl[...] 2015-05-11
[7] 뉴스그룹 patch version 1.2--YOU WANT THIS https://groups.googl[...] 2015-05-11
[8] 뉴스그룹 patch version 1.3 https://groups.googl[...] 2015-05-11
[9] 문서 diff
[10] 서적 Comparing and Merging Files with GNU Diff and Patch https://www.gnu.org/[...] Network Theory 2015-03-17
[11] 웹사이트 Detailed Description of Unified Format https://www.gnu.org/[...] 2020-01-29
[12] 웹사이트 Unified Diff Format https://www.artima.c[...] 2020-01-29
[13] URL 2.2.3 Showing Which Sections Differences Are in https://www.gnu.org/[...] GNU diffutils manual
[14] URL Unified Diff Format http://www.artima.co[...] Guido van Rossum 2006-06-14
[15] 웹인용 Section 3.206 http://pubs.opengrou[...]
[16] 웹사이트 Incomplete Lines (Comparing and Merging Files) https://www.gnu.org/[...]
[17] 웹사이트 git: apply.c https://github.com/g[...] Git 2023-05-08
[18] 웹사이트 patch.c\src - patch.git - GNU patch https://git.savannah[...]
[19] 논문 An O(ND) Difference Algorithm and Its Variations
[20] 논문 A File Comparison Program
[21] 논문 Algorithms for Approximate String Matching
[22] 웹인용 GNU Diff utilities https://www.gnu.org/[...] Free Software Foundation
[23] 웹사이트 merge (GNU RCS 5.10.0) https://www.gnu.org/[...] 2021-01-22
[24] 웹사이트 Vim documentation: diff https://vimhelp.org/[...] 2020-05-01
[25] 웹사이트 The power of diff https://vimways.org/[...] 2020-05-01
[26] 웹사이트 gnu.org https://www.gnu.org/[...] 2020-09-12
[27] 웹사이트 colordiff https://www.colordif[...] 2018-06-14
[28] 웹사이트 diff-so-fancy https://github.com/s[...] So Fancy 2023-05-06
[29] 웹사이트 dandavison/delta https://github.com/d[...] 2023-05-08
[30] 웹사이트 twaugh/patchutils https://github.com/t[...] 2020-06-28
[31] 논문 Identifying the semantic and textual differences between two versions of a program http://www.cs.wisc.e[...] 2017-11-01
[32] 논문 Identifying syntactic differences between two programs 1991-07
[33] 간행물 Grass. Cdiff: A syntax directed Diff for C++ programs. Proceedings USENIX C++ Conf., pp. 181-193, 1992
[34] 웹인용 Compare++ http://www.coodesoft[...]
[35] 웹인용 SmartDifferencer http://www.semanticd[...]
[36] 웹사이트 xaizek/zograscope https://github.com/x[...] 2020-05-26
[37] Webarchive DaisyDiff https://code.google.[...] 2015-03-19
[38] Webarchive xmldiffpatch http://msdn.microsof[...] 2009-10-27
[39] Webarchive xmldiffmerge http://www.alphawork[...] 2009-09-24
[40] Webarchive Pretty Diff - Documentation http://prettydiff.co[...] 2012-07-31
[41] 웹사이트 SPIFF 1 http://www.math.utah[...] 1988-02-02
[42] 웹사이트 Man page http://hpux.connect.[...] 1988-02-02
[43] 웹사이트 spiff https://github.com/d[...] null
[44] 웹사이트 stackoverflow https://stackoverflo[...] 2009-09-28
[45] 웹사이트 HP-UX Porting and Archiving http://hpux.connect.[...] 1999-12-01
[46] 웹사이트 LibXDiff http://freshmeat.sou[...] null
[47] 간행물 How different are different diff algorithms in Git?: Use --histogram for code changes 2020-01-01
[48] 웹사이트 algorithm - What's the difference between 'git diff --patience' and 'git diff --histogram'? https://stackoverflo[...] null
[49] 웹사이트 Wdiff - GNU Project - Free Software Foundation http://www.gnu.org/s[...] null
[50] 웹사이트 spiff-1.0 http://hpux.cs.utah.[...] utah.edu 1999-08-21
[51] 문서 unidiff
[52] 서적 Comparing and Merging Files with GNU Diff and Patch http://www.gnu.org/s[...] Network Theory 1997



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com