git diff: 워킹트리·인덱스·커밋 간 변경 내용 비교하기

git diff의 기본 사용법과 출력 형식을 이해하고, 워킹트리·인덱스·커밋 세 영역 사이를 어떻게 비교하는지 정리한다.

· 4 min read · PALDYN Team

지난 글에서 untracked 파일을 정리하는 법을 다뤘다. 이번에는 Git에서 변경 내용을 확인하는 핵심 명령 git diff를 살펴본다. 어느 영역 간의 차이를 보여주는지 이해하면 다양한 옵션이 자연스럽게 읽힌다.

세 가지 영역, 세 가지 비교

Git에는 변경이 흐르는 세 개의 공간이 있다: 워킹트리 → 인덱스(스테이징) → 커밋. git diff는 이 공간들 사이의 차이를 보여준다.

git diff 비교 영역

# 워킹트리 vs 인덱스 (아직 git add 안 한 변경)
git diff

# 인덱스 vs HEAD (git add했지만 아직 커밋 안 한 변경)
git diff --staged
git diff --cached   # --staged와 동일

# 워킹트리 vs HEAD (add/commit 여부 상관없이 이번 작업 전체)
git diff HEAD

커밋을 만들기 전에 git diff --staged로 인덱스를 한 번 검토하는 습관을 들이면 실수를 크게 줄일 수 있다.

diff 출력 읽기

git diff 출력은 unified diff 형식을 따른다.

git diff 출력 읽기

  • ---/+++: 변경 전/후 파일
  • @@ 헝크(hunk) 헤더: -10,7 +10,8는 이전 파일의 10번째 줄부터 7줄, 새 파일의 10번째 줄부터 8줄을 의미한다
  • - 접두사 줄: 삭제된 줄 (빨간색)
  • + 접두사 줄: 추가된 줄 (초록색)
  • 공백 접두사 줄: 문맥(변경 없음)

두 커밋·브랜치 비교

# 두 커밋 비교
git diff abc1234 def5678

# 브랜치 비교
git diff main feature/login

# 특정 파일만
git diff main feature/login -- src/auth.js

유용한 옵션

# 파일별 변경 통계 (라인 수)
git diff --stat

# 변경된 파일 목록만
git diff --name-only
git diff --name-status   # 상태(M/A/D)도 표시

# 단어 단위 diff (문장 내 변경이 많을 때 유용)
git diff --word-diff

# 공백 변경 무시
git diff -w
git diff --ignore-space-at-eol

--stat은 PR 리뷰 전 전체적인 변경 규모를 파악하는 데, --word-diff는 문서나 긴 문자열을 수정할 때 유용하다.

외부 diff 도구 연동

git difftool을 쓰면 VS Code, vimdiff 같은 외부 도구로 결과를 볼 수 있다.

# VS Code로 diff 보기
git difftool --tool=vscode

# 기본 도구 설정
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

정리

명령비교 대상주요 용도
git diff워킹트리 vs 인덱스스테이징 전 확인
git diff --staged인덱스 vs HEAD커밋 전 검토
git diff HEAD워킹트리 vs HEAD작업 전체 확인
git diff A B커밋·브랜치 A vs B히스토리 비교

다음 글에서는 git diff --staged를 더 깊이 살펴보고, 실제 커밋 워크플로에서 어떻게 활용하는지 다룬다.


지난 글: git clean: 추적되지 않는 파일을 한 번에 정리하기

다음 글: git diff —staged: 커밋 전 인덱스 변경 내용 검토하기


읽어주셔서 감사합니다. 😊