git diff
한 줄 요약
변경사항을 상세하게 비교
선행 지식
- Stage와 Working Directory - Git의 세 영역
- Commit - 커밋의 개념
기본 사용법
git diffWorking Directory와 Stage의 차이를 보여줍니다.
주요 사용 패턴
| 명령어 | 비교 대상 |
|---|---|
git diff | Working ↔ Stage |
git diff --staged | Stage ↔ 마지막 커밋 |
git diff HEAD | Working ↔ 마지막 커밋 |
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| 상태 | 의미 |
|---|---|
| M | Modified (수정) |
| A | Added (추가) |
| D | Deleted (삭제) |
| R | Renamed (이름 변경) |
단어 단위 비교
$ git diff --word-diff
const name = [-"old"-]{+"new"+};공백/줄바꿈 변경을 무시하고 실제 변경만 보고 싶을 때 유용합니다.
외부 diff 도구 사용
# 설정된 외부 도구로 비교
git difftool
# 특정 도구 지정
git difftool -t vscodeVS 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"관련 명령어
- git status - 변경 상태 요약
- git log - 커밋 히스토리
- git show - 특정 커밋 상세 보기
더 알아보기
- Stage와 Working Directory - Git의 세 영역
- Commit - 커밋의 구조