alltools.one
Development
2025-07-02
7 min
alltools.one Team
DiffText ComparisonGitCode ReviewMerge

텍스트 파일 비교 방법: Diff 도구와 기법

텍스트 비교는 개발자의 일상적인 작업입니다. 코드 변경 리뷰, 설정 드리프트 디버깅, 문서 병합 등 diff 출력을 이해하는 것은 필수입니다. 이 가이드에서는 효과적인 텍스트 비교를 위한 알고리즘, 도구, 기법을 다룹니다.

Diff 출력 이해하기

클래식 통합 diff 포맷은 두 파일 간의 변경 사항을 보여줍니다:

--- original.txt
+++ modified.txt
@@ -1,5 +1,6 @@
 Line 1: unchanged
-Line 2: removed text
+Line 2: modified text
+Line 2.5: added line
 Line 3: unchanged
 Line 4: unchanged
-Line 5: also removed
  • -로 시작하는 줄은 삭제됨 (원본에서)
  • +로 시작하는 줄은 추가됨 (수정본에서)
  • (공백)으로 시작하는 줄은 변경되지 않은 컨텍스트
  • @@ 마커는 영향받는 줄 번호를 표시

Diff 알고리즘

Myers 알고리즘

Git과 대부분의 diff 도구가 사용하는 기본 알고리즘. 하나의 파일을 다른 파일로 변환하기 위한 최소 삽입과 삭제의 최단 편집 스크립트를 찾습니다. 대부분의 콘텐츠에 깔끔하고 읽기 쉬운 diff를 생성합니다.

Patience Diff

소스 코드 같은 구조화된 텍스트에 더 좋습니다. 최단 편집을 찾는 대신, 먼저 두 파일에 모두 나타나는 고유한 줄을 매칭한 다음 그 사이 섹션을 diff합니다. 논리적 코드 블록에 맞는 더 의미 있는 diff를 생성하는 경우가 많습니다.

git diff --patience

Histogram Diff

Patience diff의 개선판으로, Git 2.x부터 기본값으로 사용됩니다. 반복되는 줄을 더 잘 처리하고 구조적 변경이 큰 파일에 더 깔끔한 출력을 생성합니다.

온라인에서 텍스트 비교

도구 설치 없이 빠르게 비교하려면 텍스트 비교 도구가 브라우저에서 직접 나란히 및 인라인 diff 뷰를 제공합니다. 두 텍스트를 붙여넣으면 변경 사항이 즉시 하이라이트됩니다 — 모든 처리가 로컬에서 수행됩니다.

커맨드 라인 Diff 도구

diff (POSIX)

클래식 Unix 도구:

# 통합 포맷 (가장 읽기 쉬움)
diff -u file1.txt file2.txt

# 나란히 보기
diff -y file1.txt file2.txt

# 공백 무시
diff -w file1.txt file2.txt

# 재귀적 디렉토리 비교
diff -r dir1/ dir2/

git diff

Git 저장소 외부에서도 git diff가 더 나은 출력을 제공합니다:

# 두 파일 비교
git diff --no-index file1.txt file2.txt

# 단어 수준 diff (전체 줄이 아닌 변경된 단어를 하이라이트)
git diff --word-diff

# 통계 요약 (변경된 파일, 삽입, 삭제)
git diff --stat

colordiff / delta

색상이 있는 터미널 출력:

# colordiff: diff의 드롭인 대체
colordiff file1.txt file2.txt

# delta: Git을 위한 모던 diff 뷰어
git diff | delta

코드 리뷰를 위한 Diff

효과적인 코드 리뷰는 읽기 쉬운 diff에 달려 있습니다. diff 품질을 개선하는 기법:

1. 커밋을 집중적으로 유지

수백 줄에 걸친 큰 diff는 리뷰하기 어렵습니다. 각 커밋은 하나의 관심사를 다뤄야 합니다:

  • 포맷 변경과 로직 변경을 분리
  • 대규모 리팩토링을 점진적 단계로 분할
  • 파일 이동은 한 커밋에서, 수정은 다른 커밋에서

2. 단어 수준 Diff 사용

줄 수준 diff는 긴 문자열에 작은 수정이 묻히면 실제 변경을 숨깁니다:

# 전체 줄이 아닌 변경된 단어만 표시
git diff --word-diff

3. 리뷰에서 공백 무시

포맷 변경은 의미 있는 diff에 노이즈를 추가합니다:

git diff -w        # 모든 공백 변경 무시
git diff -b        # 공백 양 변경 무시

4. 컨텍스트와 함께 리뷰

더 많은 컨텍스트 줄이 주변 코드를 이해하는 데 도움됩니다:

git diff -U10      # 10줄의 컨텍스트 표시 (기본값은 3)

병합 충돌 처리

Git이 충돌하는 변경을 만나면 파일에 충돌을 표시합니다:

<<<<<<< HEAD
const timeout = 5000;
=======
const timeout = 10000;
>>>>>>> feature-branch

해결 방법:

  1. 두 변경 모두 이해 — 각각 왜 만들어졌는가?
  2. 어떤 버전을 유지할지 결정하거나 결합
  3. 충돌 마커 제거
  4. 결과 테스트

복잡한 병합의 경우, 두 버전과 함께 공통 조상을 보여주는 3자 병합 도구를 사용하세요.

비텍스트 콘텐츠 비교

JSON Diff

표준 텍스트 diff는 키 순서와 포맷 변경이 노이즈를 만들기 때문에 JSON에 어려움을 겪습니다. 시맨틱 JSON diff는 실제 데이터 구조를 비교합니다. 구조적 비교는 JSON Diff 도구를 확인하세요.

CSV Diff

표형 데이터는 열 인식 비교가 필요합니다. 표준 diff는 각 행을 문자열로 처리하여 셀 수준 변경을 놓칩니다.

바이너리 파일

Diff는 바이너리 파일을 의미 있게 비교할 수 없습니다. 이미지의 경우 시각적 diff 도구를 사용하세요. 문서의 경우 먼저 텍스트로 변환하거나 포맷별 비교 도구를 사용하세요.

자동화에서의 Diff

CI/CD 파이프라인

테스트에서 예상 출력을 검증하는 데 diff 사용:

command_under_test > actual_output.txt
diff expected_output.txt actual_output.txt
# 종료 코드 0 = 동일, 1 = 다름

설정 드리프트 감지

프로덕션 설정을 예상 상태와 비교:

diff deployed_config.yaml expected_config.yaml

문서 변경 추적

리뷰를 위한 문서 변경 추적:

git diff --stat HEAD~5..HEAD -- docs/

FAQ

diff 출력에서 "hunk"란 무엇인가요?

Hunk는 diff에서 연속된 변경 블록입니다. 각 @@ 줄이 새 hunk를 시작합니다. Git은 가까운 변경을 단일 hunk로 그룹화합니다 — 두 변경이 3줄 이내(기본 컨텍스트)라면 같은 hunk에 나타납니다. Hunk는 git add -p를 사용하여 독립적으로 스테이지할 수 있습니다.

Git에서 두 브랜치를 어떻게 비교하나요?

git diff branch1..branch2를 사용하여 두 브랜치 간의 모든 차이를 확인하세요. 요약에는 --stat를, 특정 파일 비교에는 -- path/to/file을 추가하세요. 브랜치가 분기된 이후 추가된 내용을 비교하려면 세 개의 점을 사용하세요: git diff branch1...branch2.

관련 리소스

Published on 2025-07-02
How to Compare Text Files: Diff Tools and Techniques | alltools.one