git diff

한 줄 요약

변경사항을 상세하게 비교

선행 지식

기본 사용법

git diff

Working Directory와 Stage의 차이를 보여줍니다.

주요 사용 패턴

명령어비교 대상
git diffWorking ↔ Stage
git diff --stagedStage ↔ 마지막 커밋
git diff HEADWorking ↔ 마지막 커밋
git diff A B커밋 A ↔ 커밋 B
git diff branch1 branch2브랜치 간 비교

비교 영역 이해

┌────────────┐    ┌────────────┐    ┌────────────┐
│  Working   │    │   Stage    │    │ Repository │
│ Directory  │    │            │    │ (HEAD)     │
└────────────┘    └────────────┘    └────────────┘
       │                │                │
       │  git diff      │                │
       ├───────────────▶│                │
       │                │                │
       │         git diff --staged       │
       │                ├───────────────▶│
       │                │                │
       │         git diff HEAD           │
       ├────────────────────────────────▶│

실제 예제

Working Directory 변경 확인

# 아직 Stage에 올리지 않은 변경사항
$ git diff
 
diff --git a/app.js b/app.js
index 1234567..abcdefg 100644
--- a/app.js
+++ b/app.js
@@ -10,7 +10,8 @@ function login() {
   const username = getUsername();
   const password = getPassword();
-  return authenticate(username, password);
+  const result = authenticate(username, password);
+  logAttempt(username, result);
+  return result;
 }

출력 이해하기

diff --git a/app.js b/app.js      # 비교 파일
index 1234567..abcdefg 100644     # 파일 해시
--- a/app.js                       # 변경 전 (a)
+++ b/app.js                       # 변경 후 (b)
@@ -10,7 +10,8 @@                  # 위치: 10번째 줄, 7줄→8줄
 context line                      # 변경 없는 줄 (흰색)
-removed line                      # 삭제된 줄 (빨간색)
+added line                        # 추가된 줄 (초록색)

Stage에 올린 변경 확인

# 커밋될 예정인 변경사항
git diff --staged
# 또는
git diff --cached   # 같은 의미

커밋과 비교

# 마지막 커밋과 현재 Working Directory 비교
git diff HEAD
 
# 특정 커밋과 비교
git diff a1b2c3d
 
# 두 커밋 간 비교
git diff a1b2c3d 9x8y7z6

브랜치 비교

# 두 브랜치 비교
git diff main feature
 
# 현재 브랜치와 다른 브랜치 비교
git diff main
 
# 브랜치 분기점부터의 변경
git diff main...feature

특정 파일만 비교

# 특정 파일
git diff -- app.js
 
# 특정 폴더
git diff -- src/
 
# 여러 파일
git diff -- app.js utils.js

주요 옵션

옵션설명예시
--stat변경 통계만git diff --stat
--name-only파일명만git diff --name-only
--name-status파일명 + 상태git diff --name-status
-w공백 무시git diff -w
--word-diff단어 단위 비교git diff --word-diff

통계만 보기

$ git diff --stat
 app.js   | 15 +++++++++++----
 utils.js |  8 ++++++++
 2 files changed, 19 insertions(+), 4 deletions(-)

변경된 파일 목록만

$ git diff --name-only
app.js
utils.js
 
$ git diff --name-status
M  app.js
A  utils.js
상태의미
MModified (수정)
AAdded (추가)
DDeleted (삭제)
RRenamed (이름 변경)

단어 단위 비교

$ git diff --word-diff
const name = [-"old"-]{+"new"+};

공백/줄바꿈 변경을 무시하고 실제 변경만 보고 싶을 때 유용합니다.

외부 diff 도구 사용

# 설정된 외부 도구로 비교
git difftool
 
# 특정 도구 지정
git difftool -t vscode

VS Code 설정:

git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

자주 하는 실수

diff 출력이 없음

원인 1: 변경사항을 이미 Stage에 올림

git diff           # 출력 없음
git diff --staged  # 여기에 있음!

원인 2: 이미 커밋함

git diff           # 출력 없음
git diff HEAD~1    # 이전 커밋과 비교

바이너리 파일 비교

$ git diff
Binary files a/image.png and b/image.png differ

바이너리 파일은 상세 비교가 불가능합니다.

유용한 별칭

git config --global alias.d "diff"
git config --global alias.ds "diff --staged"
git config --global alias.dw "diff --word-diff"

관련 명령어

더 알아보기