[GitHub 100일 챌린지] Day 38 - git diff 변경사항 확인
100일 챌린지 Day 38 - 파일 변경사항을 정확하게 비교합니다
배울 내용
- diff 기본 개념
- diff 옵션들
- diff 활용 시나리오
Topic1. diff 기본 개념
git diff = 변경사항 비교
파일의 변경사항을 줄 단위로 비교하여 보여주는 명령어입니다.
기본 사용법
1
git diff
Working Directory vs Staging Area 비교
출력 예시:
1
2
3
4
5
6
7
8
9
10
11
diff --git a/index.html b/index.html
index 1234567..89abcdef 100644
--- a/index.html
+++ b/index.html
@@ -10,7 +10,7 @@
<body>
- <h1>Welcome</h1>
+ <h1>Welcome to My Site</h1>
<p>This is my website.</p>
+ <p>New paragraph added.</p>
</body>
출력 구조 이해하기
헤더 정보:
1
2
3
4
diff --git a/index.html b/index.html # 비교 대상 파일
index 1234567..89abcdef 100644 # 파일 해시와 모드
--- a/index.html # 이전 버전 (-)
+++ b/index.html # 새 버전 (+)
변경 위치 (Hunk Header):
1
@@ -10,7 +10,7 @@
의미:
-10,7: 이전 버전 10번째 줄부터 7줄+10,7: 새 버전 10번째 줄부터 7줄
변경 내용:
1
2
3
4
- <h1>Welcome</h1> # 삭제된 줄 (빨간색)
+ <h1>Welcome to My Site</h1> # 추가된 줄 (초록색)
<p>This is my website.</p> # 변경 없는 줄 (흰색)
+ <p>New paragraph added.</p> # 추가된 줄 (초록색)
기호 의미:
1
2
3
- = 삭제 (빨간색)
+ = 추가 (초록색)
= 변경 없음 (컨텍스트)
diff의 3가지 주요 비교
1. Working Directory vs Staging Area (기본):
1
git diff
수정했지만 아직 git add 안 한 파일들을 보여줍니다.
2. Staging Area vs 마지막 커밋:
1
2
3
git diff --staged
# 또는
git diff --cached
git add한 파일들을 보여줍니다 (다음 커밋에 포함될 내용).
3. Working Directory vs 마지막 커밋:
1
git diff HEAD
Staging 여부 상관없이 모든 변경사항을 보여줍니다.
비교 구조 시각화
1
2
Commit (HEAD) ←─ git diff --staged ─→ Staging Area ←─ git diff ─→ Working Directory
└───────────────── git diff HEAD ──────────────────┘
해보기: 각 diff 비교해보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. 파일 수정
echo "New content" >> README.md
# 2. Working Directory 변경사항
git diff
# README.md 변경사항 표시
# 3. staging
git add README.md
# 4. 이제 git diff는 빈 출력
git diff
# (변경사항 없음)
# 5. Staging Area 변경사항
git diff --staged
# README.md 변경사항 표시
# 6. 다시 수정
echo "More content" >> README.md
# 7. 모든 변경사항
git diff HEAD
# README.md의 모든 변경사항 (staged + unstaged)
결과: diff의 세 가지 비교 방식을 이해했습니다
Topic2. diff 옵션들
diff 옵션 = 더 나은 가독성
다양한 옵션으로 diff 출력을 개선합니다.
통계 정보 (–stat)
1
git diff --stat
출력:
1
2
3
4
README.md | 5 +++--
src/auth.js | 45 +++++++++++++++++++++++++++++++++++++++++++++
src/main.js | 12 +++++-------
3 files changed, 53 insertions(+), 9 deletions(-)
파일별 변경 라인 수만 간결하게 표시합니다.
요약 정보 (–shortstat)
1
git diff --shortstat
출력:
1
3 files changed, 53 insertions(+), 9 deletions(-)
전체 통계만 한 줄로 표시합니다.
파일 이름만 (–name-only)
1
git diff --name-only
출력:
1
2
3
README.md
src/auth.js
src/main.js
변경된 파일 이름만 나열합니다.
파일 이름 + 상태 (–name-status)
1
git diff --name-status
출력:
1
2
3
M README.md
A src/auth.js
M src/main.js
상태 코드:
1
2
3
4
5
M = Modified (수정)
A = Added (추가)
D = Deleted (삭제)
R = Renamed (이름 변경)
C = Copied (복사)
단어 단위 비교 (–word-diff)
1
git diff --word-diff
출력:
1
<h1>Welcome[-]- {+to My Site+}</h1>
줄 단위가 아닌 단어 단위로 변경사항을 표시합니다.
유용한 경우:
- 한 줄에서 작은 수정만 있을 때
- Markdown이나 문서 파일
- 긴 줄이 많은 코드
색상 강조 (–color-words)
1
git diff --color-words
단어 단위 비교 + 색상 강조로 더 읽기 쉽습니다.
컨텍스트 라인 수 조절 (-U)
1
2
3
4
5
6
7
8
9
10
11
# 기본 (3줄)
git diff
# 5줄
git diff -U5
# 10줄
git diff -U10
# 컨텍스트 없이
git diff -U0
예시:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -U3 (기본)
@@ -10,7 +10,7 @@
line 8
line 9
line 10
-old line
+new line
line 12
line 13
line 14
# -U1 (1줄)
@@ -10,3 +10,3 @@
line 10
-old line
+new line
line 12
공백 무시 옵션
1
2
3
4
5
6
7
8
9
10
# 모든 공백 무시
git diff -w
# 또는
git diff --ignore-all-space
# 공백 변경만 무시
git diff --ignore-space-change
# 줄 끝 공백 무시
git diff --ignore-space-at-eol
유용한 경우:
- 들여쓰기만 변경됨
- 포맷팅 도구 사용 후
- 공백 문자 정리 작업 후
특정 파일/디렉토리만
1
2
3
4
5
6
7
8
9
10
11
# 특정 파일
git diff README.md
# 여러 파일
git diff src/auth.js src/main.js
# 디렉토리
git diff src/
# 패턴 매칭
git diff '*.js'
이진 파일 (–binary)
1
git diff --binary
이미지 같은 이진 파일의 변경사항도 표시 (base64 인코딩).
두 커밋 비교
1
2
3
4
5
6
7
8
9
10
11
# 특정 커밋들 비교
git diff a1b2c3d e4f5g6h
# 커밋과 현재 비교
git diff a1b2c3d
# 브랜치 비교
git diff main feature
# 태그 비교
git diff v1.0 v2.0
해보기: 다양한 옵션 조합
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. 통계만 빠르게
git diff --stat
# 2. 변경된 파일 목록
git diff --name-only
# 3. 단어 단위 비교
git diff --color-words README.md
# 4. 공백 무시하고 비교
git diff -w
# 5. 특정 디렉토리만
git diff --stat src/
# 6. 커밋 간 비교 + 통계
git diff HEAD~1 HEAD --stat
# 7. 브랜치 비교 + 파일 목록
git diff main feature --name-status
결과: 필요에 맞는 diff 출력 형식을 선택할 수 있습니다
Topic3. diff 활용 시나리오
diff 활용 = 실전 워크플로우
실제 개발 과정에서 유용한 diff 사용법들입니다.
시나리오 1: 커밋 전 리뷰
목적: 커밋하기 전에 변경사항 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 변경사항 확인
git status
# 2. 상세 내용 리뷰
git diff
# 3. 파일별로 확인
git diff src/auth.js
git diff src/main.js
# 4. staging
git add src/auth.js
# 5. staged 내용 최종 확인
git diff --staged
# 6. 문제 없으면 커밋
git commit -m "Add authentication"
시나리오 2: 코드 리뷰
목적: 팀원의 변경사항 리뷰
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 브랜치 비교
git diff main feature-branch
# 2. 파일 목록 먼저 확인
git diff main feature-branch --name-status
# 3. 특정 파일만 상세히
git diff main feature-branch -- src/important.js
# 4. 통계 보기
git diff main feature-branch --stat
# 5. 공백 제외하고 보기
git diff main feature-branch -w
시나리오 3: 버그 추적
목적: 언제 버그가 도입됐는지 찾기
1
2
3
4
5
6
7
8
9
10
11
# 1. 현재와 과거 버전 비교
git diff v1.0 HEAD -- src/buggy-file.js
# 2. 특정 커밋 사이 비교
git diff a1b2c3d e4f5g6h -- src/buggy-file.js
# 3. 단어 단위로 자세히
git diff --color-words a1b2c3d e4f5g6h -- src/buggy-file.js
# 4. 특정 함수 변경 찾기
git log -p -S "function buggyFunction" -- src/buggy-file.js
시나리오 4: 병합 전 미리보기
목적: 병합 시 어떤 변경이 있을지 확인
1
2
3
4
5
6
7
8
9
10
11
# 1. 병합될 내용 미리보기
git diff HEAD...feature-branch
# 2. 통계로 영향 범위 파악
git diff HEAD...feature-branch --stat
# 3. 충돌 가능성 있는 파일 확인
git diff HEAD...feature-branch --name-only
# 4. 특정 파일 충돌 여부
git diff HEAD...feature-branch -- src/main.js
.. vs ... 차이:
1
2
3
4
5
6
7
# A..B = B에만 있는 변경사항
git diff main..feature
# feature 브랜치의 변경사항
# A...B = 공통 조상 이후 B의 변경사항
git diff main...feature
# feature가 분기한 이후 추가된 변경사항만
시나리오 5: 릴리스 노트 작성
목적: 버전 간 변경사항 문서화
1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 전체 변경사항 요약
git diff v1.0 v2.0 --stat
# 2. 중요 파일 변경사항
git diff v1.0 v2.0 -- CHANGELOG.md
git diff v1.0 v2.0 -- package.json
# 3. API 변경사항
git diff v1.0 v2.0 -- src/api/
# 4. 문서로 저장
git diff v1.0 v2.0 --stat > release-v2.0-changes.txt
git diff v1.0 v2.0 -- src/api/ > api-changes.diff
시나리오 6: 부분 staging
목적: 파일의 일부만 staging
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 파일 변경사항 확인
git diff myfile.js
# 2. 대화형 staging
git add -p myfile.js
# 출력:
# diff --git a/myfile.js b/myfile.js
# ...
# Stage this hunk [y,n,q,a,d,e,?]?
# y = 이 부분 stage
# n = 이 부분 skip
# s = 더 작은 부분으로 split
# e = 수동으로 편집
# q = 종료
# 3. staged 확인
git diff --staged myfile.js
# 4. unstaged 남은 것 확인
git diff myfile.js
시나리오 7: 변경사항 패치 파일로
목적: 변경사항을 파일로 저장/공유
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 패치 파일 생성
git diff > my-changes.patch
# 2. 특정 파일만
git diff src/auth.js > auth-changes.patch
# 3. staged 내용만
git diff --staged > staged-changes.patch
# 4. 패치 적용
git apply my-changes.patch
# 5. 패치 적용 전 테스트
git apply --check my-changes.patch
시나리오 8: 성능 분석
목적: 코드 복잡도 변화 추적
1
2
3
4
5
6
7
8
9
10
11
# 1. 파일 크기 변화
git diff HEAD~1 HEAD --stat
# 2. 추가/삭제 라인 수
git diff HEAD~1 HEAD --shortstat
# 3. 복잡한 함수 변경
git diff HEAD~1 HEAD -- src/complex-module.js -U10
# 4. 성능 중요 파일 모니터링
watch -n 60 'git diff --stat src/performance-critical/'
해보기: 실전 워크플로우 연습
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 시나리오: 새 기능 개발 후 커밋
# 1. 전체 변경사항 파악
git status
git diff --stat
# 2. 각 파일 리뷰
git diff src/new-feature.js
git diff src/main.js
# 3. 테스트 파일 확인
git diff tests/new-feature.test.js
# 4. 공백 제외하고 확인
git diff -w
# 5. 문제 없으면 staging
git add src/new-feature.js tests/new-feature.test.js
# 6. staged 최종 확인
git diff --staged --stat
git diff --staged
# 7. 커밋
git commit -m "feat: Add new feature
- Implement feature X
- Add comprehensive tests
- Update documentation"
# 8. 커밋 내용 확인
git show HEAD --stat
결과: diff를 활용하여 안전하고 정확한 코드 관리를 할 수 있습니다
정리
완료 체크:
- diff 기본 개념과 출력 구조를 안다
- 다양한 diff 옵션을 상황에 맞게 사용할 수 있다
- 실전 워크플로우에서 diff를 활용할 수 있다
핵심 명령어:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 기본 비교
git diff # Working Directory vs Staging
git diff --staged # Staging vs 마지막 커밋
git diff HEAD # Working Directory vs 마지막 커밋
# 출력 형식
git diff --stat # 통계 정보
git diff --name-only # 파일 이름만
git diff --name-status # 파일 + 상태
git diff --word-diff # 단어 단위
git diff --color-words # 단어 단위 + 색상
# 옵션
git diff -w # 공백 무시
git diff -U5 # 컨텍스트 5줄
git diff -- file.js # 특정 파일
git diff src/ # 특정 디렉토리
# 커밋/브랜치 비교
git diff a1b2c3d e4f5g6h # 커밋 비교
git diff main feature # 브랜치 비교
git diff v1.0 v2.0 # 태그 비교
git diff HEAD~1 HEAD # 이전 커밋과 비교
git diff main..feature # feature만의 변경사항
git diff main...feature # 분기 이후 변경사항
# 패치 파일
git diff > changes.patch # 패치 저장
git apply changes.patch # 패치 적용
비교 구조 요약:
1
2
Commit (HEAD) ←── --staged ──→ Staging ←── (default) ──→ Working Dir
└──────────────────── HEAD ──────────────────────┘
실전 패턴:
1
2
3
4
5
6
1. 커밋 전: git diff → git diff --staged
2. 코드 리뷰: git diff main feature --stat
3. 버그 추적: git diff v1.0 HEAD -- file.js
4. 병합 미리보기: git diff HEAD...feature
5. 부분 staging: git add -p
6. 패치 공유: git diff > patch.diff
유용한 Alias:
1
2
3
git config --global alias.ds 'diff --staged'
git config --global alias.dw 'diff --word-diff'
git config --global alias.dt 'diff --stat'
다음: Day 39 - git show 커밋 상세보기 →
