포스트

[GitHub 100일 챌린지] Day 38 - git diff 변경사항 확인

[GitHub 100일 챌린지] Day 38 - git diff 변경사항 확인

100일 챌린지 Day 38 - 파일 변경사항을 정확하게 비교합니다

배울 내용

  1. diff 기본 개념
  2. diff 옵션들
  3. 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 커밋 상세보기


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.