diff::Unified format

이 글은 Wikipedia의 diff 설명 중에서 unified format 절만 번역한 것이다. git은 기본 format으로 diff format을 사용한다.

Wikipedia의 unified format

Unified format은(unidiff라고도 부름) 기술적으로 Context format을 개선한 것이지만 원래 텍스트와 새로운 텍스트를 붙여서 보여주기 때문에 diff의 크기가 더 작다. Unified format은 diff에 '-u' 옵션을 주면 만들 수 있고 결과는 patch 프로그램에서도 사용한다. 많은 프로젝트들은 'diff'의 형식으로 이 format을 요구하고 있어서 개발자들 끼리 diff를 주고 받을 때 가장 널리 사용되는 format이다.

Unified format은 원래 Wayne davison이 1990년 8월에 만들었다(comp.sources.misc Volume 14의 unidiff). 한달 후에 Richard Stallman이 GNU 프로젝트의 diff가 unified diff를 지원하도록 만들어서 1991년 1월에 배포된 GNU diff 1.15부터 이 기능이 포함됐다. GNU diff는 context format를 일반화 시켰기 때문에 diff를 다양한 포멧으로 생성할 수 있다.

context format처럼 이 format도 '—-'와 '+++' 라인 헤더를 가지고 있다. '—-'는 원래 파일을 말하고'+++'는 새파일을 말한다. 파일에서 실제로 차이가 있는 부분(이하 hunk)을 나타내는 헤더도 있고 같은 부분은 스페이스 문자 하나를, 추가된 부분은 '+'를, 삭제된 부분은 '-'를 헤더로 사용한다.

Hunk는 줄 단위의 범위 정보가 들어 있는 라인으로 시작하고 계속해서 어떤 라인인지 추가되는지, 어떤 라인이 삭제되는지, 그리고 그냥 놔둘 라인은 어떤 것인지를 보여준다. 범위 정보는 '@@'사이에 표현한다:

@@ -l,s +l,s @@

Hunk에 대한 범위 정보는 사실 두 가지 정보를 포함한다. 원래 Hunk에 대한 것은 '-'뒤에 나오고 새로운 파일의 범위정보는 '+'뒤에 나온다. 범위는 l,s형식으로 표현하는데 l은 Hunk가 시작되는 라인의 번호이고 s는 Hunk의 라인 수다. GNU diff는 콤마와 s를 생략하는 경우도 있는데 이 때에는 s값이 1인 것을 의미한다. Hunk가 시작되는 라인 번호인 l값만 있어도 나머지 값들은 diff가 계산해 낸다.

(역주 - 그러니까 @@ -(원래 Hunk의 시작 줄 번호),(원래 Hunk의 라인 수) +(변경된 Hunk가 시작하는 줄 번호),(변경된 Hunk의 라인 수) @@라는 것)

원래 Hunk의 범위는 변경되지 않은 것과 삭제된 것을 더한 것이고 새로운 Hunk의 범위는 변경하지 않은 것과 추가되는 것을 합한 것이다. 실제 Hunk의 라인 수와 '@@' 표현되는 Hunk 헤더의 값이 다르면 diff는 diff파일이 깨진 것으로 판단한다.

어떤 라인이 수정되면 삭제하고 다시 추가된 것으로 표현한다. 원래 파일과 새 파일의 다른 부분은 하나의 Hunk에 표현되고 실제로 차이가 나는 라인이 바로 이어진다. 한 라인만 다른 경우는 다음과 같다:

-check this dokument. On
+check this document. On

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.