텍스트 비교, 초록·빨강·회색 읽는 법

두 버전의 글이나 코드를 나란히 놓고 "어느 줄이 바뀌었나"를 눈으로 찾는 건 생각보다 실수가 잦습니다. 사람 눈은 비슷한 줄을 같은 줄로 착각하기 쉽기 때문입니다.
줄 단위 비교(diff)는 이 작업을 기계적으로 해서, 추가된 줄은 초록, 삭제된 줄은 빨강, 그대로인 줄은 회색으로 나눠 보여 줍니다. 이 글은 어느 버전이 옳은지가 아니라, 그 결과를 정확히 읽는 법을 계산 원리부터 풀어 설명합니다.
요약 ① diff는 먼저 두 글에서 순서를 지키며 최대한 겹치는 공통 줄(LCS)을 찾고, 남은 줄을 추가·삭제로 나눕니다. ② 초록(+)은 변경본에만 있는 줄, 빨강(−)은 원본에만 있는 줄, 회색은 양쪽에 똑같이 있는 줄입니다. ③ 비교 단위가 '줄'이라, 한 줄 안의 사소한 수정도 그 줄 전체가 '삭제 후 추가'로 잡힙니다.
"어디가 바뀌었지"를 눈으로 찾다 놓치는 순간
동료가 공지문이나 계약서 개정본을 보내면서 "두세 군데 고쳤어요"라고만 말합니다. 원본과 새 버전을 나란히 띄워놓고 위에서부터 읽어 내려가며 다른 곳을 찾습니다.
문제는 사람 눈이 비슷한 줄을 같은 줄로 착각한다는 점입니다. 앞부분 몇 글자가 같으면 "여긴 안 바뀌었네" 하고 넘어가는데, 정작 뒤쪽 날짜나 금액 한 곳만 바뀌어 있는 경우가 많습니다. 긴 문서일수록 이런 누락이 늘어납니다.
코드나 설정 파일은 더 예민합니다. 띄어쓰기 하나, 세미콜론 하나 차이로 동작이 달라지는데, 그런 미세한 변화는 눈으로 훑어서는 거의 잡히지 않습니다.
그래서 필요한 것이 "어느 줄이 추가·삭제·그대로인지"를 기계적으로 판정해 색으로 보여 주는 줄 단위 비교입니다.
도구 없이 직접 줄 단위로 비교하는 법
diff는 마법이 아니라 정해진 규칙을 따르는 계산입니다. 원리만 알면 짧은 글은 손으로도 똑같이 할 수 있습니다.
핵심은 두 단계입니다. 먼저 양쪽에 순서를 지키며 똑같이 등장하는 줄들을 최대한 길게 찾아냅니다. 이걸 최장 공통 부분수열(LCS)이라고 부릅니다. 그다음 이 공통 줄에 끼지 못한 나머지를, 원본에만 있으면 삭제, 변경본에만 있으면 추가로 표시합니다.
예를 들어 원본과 변경본이 이렇다고 해봅시다.
[원본] [변경본]
사과 사과
바나나 딸기
포도 포도
양쪽에 순서대로 똑같이 나오는 줄은 '사과'와 '포도'입니다. 이 둘이 공통 줄(회색)입니다. 남은 '바나나'는 원본에만 있으니 삭제(빨강 −), '딸기'는 변경본에만 있으니 추가(초록 +)입니다.
결과를 순서대로 이으면 이렇게 됩니다.
사과 (동일)
- 바나나 (삭제)
+ 딸기 (추가)
포도 (동일)
요약하면 추가 1줄, 삭제 1줄, 동일 2줄입니다. 이것이 도구가 화면 위에 보여 주는 숫자와 색의 정체입니다.
명령어에 익숙하다면 같은 일을 표준 도구로도 할 수 있습니다. macOS·리눅스라면 두 파일을 만들어 diff 원본.txt 변경본.txt, 깃 저장소가 아니어도 git diff --no-index 원본.txt 변경본.txt를 쓰면 됩니다. 이들 diff 계열 도구도 공통 줄을 최대한 맞춘 뒤 나머지를 +/−로 표시하는, 같은 원리로 동작합니다.
다만 파일을 만들고 명령어를 치는 게 번거롭고, 색으로 구분된 결과를 한눈에 보기엔 웹 화면이 편합니다.
저희 도구로 확인하기.
설치·회원가입 없이 두 텍스트를 붙여넣으면 브라우저 안에서 바로 줄 단위로 비교합니다. 입력한 내용은 서버로 전송되지 않습니다.

결과를 읽을 때 자주 하는 오해
가장 흔한 오해는 색을 '옳고 그름'으로 읽는 것입니다. 초록과 빨강은 어느 줄이 어느 쪽에 있는지를 표시할 뿐, 어느 버전이 맞다는 뜻이 아닙니다.
| 오해 | 실제 |
|---|---|
| 단어가 바뀌면 그 단어만 색이 칠해진다 | 줄 단위 비교라 바뀐 줄 '전체'가 삭제 후 추가로 표시됩니다 |
| 빨강은 틀린 내용, 초록은 맞는 내용 | 빨강은 원본에만, 초록은 변경본에만 있는 줄일 뿐 옳고 그름과 무관합니다 |
| 줄 순서만 바꾸면 '동일'로 남는다 | 순서를 유지해 맞추므로, 이동한 줄은 원위치에서 삭제·새 위치에서 추가로 잡힙니다 |
| 들여쓰기·공백 차이는 무시된다 | 줄 내용이 조금이라도 다르면 다른 줄로 취급됩니다 |
| 아무리 긴 문서도 비교된다 | 양쪽 줄 수의 곱이 400만을 넘으면 비교 대신 안내 문구가 나옵니다 |
특히 표의 첫 항목, 한 줄 안의 작은 수정이 헷갈립니다. "재고 3개"를 "재고 5개"로 고치면, diff는 '재고 3개'를 삭제로, '재고 5개'를 추가로 각각 한 줄씩 잡습니다. 숫자 하나만 바뀌었어도 그 줄은 공통 줄 목록에 들지 못하기 때문입니다.
이건 오류가 아니라 줄 단위 비교의 정의 그대로입니다. 단어 단위로 어느 글자가 바뀌었는지까지 보고 싶다면, 그건 다른 종류의 비교라는 점을 알고 결과를 읽어야 합니다.
정리
- diff는 먼저 순서를 지키며 겹치는 공통 줄(LCS)을 찾고, 나머지를 추가·삭제로 나눕니다.
- 초록(+)은 변경본에만, 빨강(−)은 원본에만, 회색은 양쪽에 똑같이 있는 줄입니다. 색은 옳고 그름이 아닙니다.
- 비교 단위가 '줄'이라, 한 글자만 고쳐도 그 줄 전체가 '삭제 1줄 + 추가 1줄'로 표시됩니다.
- 들여쓰기·공백만 달라도 다른 줄로 잡히고, 줄 순서를 바꾸면 이동한 줄이 추가·삭제로 나타납니다.
- 양쪽 줄 수의 곱이 400만을 넘으면 비교 대신 안내가 나오므로, 아주 긴 문서는 나눠서 비교합니다.
설치·회원가입 없이 두 텍스트를 붙여넣으면 브라우저 안에서 바로 줄 단위로 비교합니다. 입력한 내용은 서버로 전송되지 않습니다.
자주 묻는 질문
한 글자만 고쳤는데 왜 줄 전체가 빨강·초록으로 뜨나요?
이 비교가 '줄' 단위이기 때문입니다. diff는 양쪽에 똑같이 있는 줄만 공통(회색)으로 묶는데, 한 글자라도 다른 줄은 '똑같은 줄'이 아니므로 공통에 들지 못합니다. 그래서 원본의 그 줄은 삭제(빨강), 변경본의 그 줄은 추가(초록)로 각각 한 줄씩 표시됩니다. 단어나 글자 단위로 바뀐 부분만 강조하는 방식과는 다릅니다.
초록과 빨강 중 어느 쪽이 '맞는' 내용인가요?
색만으로는 알 수 없습니다. 빨강은 왼쪽(원본)에만 있던 줄, 초록은 오른쪽(변경본)에만 있는 줄이라는 위치 정보일 뿐, 어느 쪽이 옳다는 판단은 담겨 있지 않습니다. 무엇이 맞는지는 내용을 보고 사람이 정합니다. 도구는 "무엇이 달라졌는지"까지만 보여 줍니다.
줄 순서만 바꿨는데 왜 추가·삭제로 나오나요?
diff가 공통 줄을 찾을 때 '순서'를 유지하기 때문입니다. 문단을 아래로 옮기면, 원래 자리에서는 그 줄이 사라졌으니 삭제로, 새 자리에서는 없던 줄이 생겼으니 추가로 잡힙니다. 내용은 그대로여도 위치가 달라지면 이렇게 표시될 수 있습니다.
아주 긴 문서를 붙여넣으니 비교가 안 됩니다.
양쪽 줄 수를 곱한 값이 400만을 넘으면, 계산량이 너무 커져 성능을 위해 비교 대신 안내 문구가 나옵니다. 예를 들어 양쪽이 각각 2,500줄이면 곱이 625만이라 안내가 표시됩니다. 이럴 때는 장·절 단위로 문서를 나눠 부분씩 비교하면 됩니다.
