🔥 git diff

615자
6분

개발자들이 소스 코드를 수정하다 보면 코드 변경 내역을 확인해야 할 때가 많습니다. 이럴 때 git diff 명령어를 사용하면 쉽고 빠르게 변경 사항을 파악할 수 있어요.

1. git diff 기본 사용법

git diff는 워킹 디렉토리와 스테이징 영역 간의 차이를 보여줍니다. 아래 예시를 살펴봅시다.

# 예시 파일 생성
echo "Hello, world" > hello.txt
git add hello.txt
 
# hello.txt 파일 수정
echo "Hello, Git" > hello.txt
 
# git diff 실행
git diff
shell

위 명령어를 실행하면 아래와 같은 결과가 출력됩니다.

**diff --git a/hello.txt b/hello.txt**
**index a5c1966..b7aec52 100644**
**--- a/hello.txt**
**+++ b/hello.txt**
@@ -1 +1 @@
-Hello, world
+Hello, Git
diff
  • 로 시작하는 줄은 삭제된 내용, +로 시작하는 줄은 추가된 내용을 나타냅니다. 이를 통해 hello.txt 파일의 "Hello, world"가 "Hello, Git"으로 변경되었음을 알 수 있죠.

2. 커밋 간 차이 비교하기

git diff에 커밋 해시를 인자로 전달하면 특정 커밋 간의 차이를 비교할 수 있습니다. 아래 예시를 봐주세요.

# 예시 커밋 생성
echo "Initial commit" > README.md
git add README.md
git commit -m "Initial commit"
 
echo "Update README" > README.md
git add README.md
git commit -m "Update README"
 
# 커밋 간 차이 비교
git diff HEAD~1 HEAD
shell

HEAD~1은 현재 커밋의 직전 커밋을, HEAD는 현재 커밋을 가리킵니다. 위 명령어는 직전 커밋과 현재 커밋의 차이를 출력해 줍니다.

diff --git a/README.md b/README.md
index 5852f44..37c0a43 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-Initial commit
+Update README
diff

보시다시피 README.md 파일의 내용이 "Initial commit"에서 "Update README"로 변경되었네요.

3. 브랜치 간 차이 비교하기

git diff 명령어에 브랜치 이름을 전달하면 서로 다른 브랜치 간의 차이를 비교할 수 있습니다. 이 기능은 브랜치를 병합하기 전에 변경 사항을 검토할 때 유용하죠.

# feature 브랜치 생성 및 체크아웃
git checkout -b feature
 
# 파일 수정 및 커밋
echo "New feature" > feature.txt
git add feature.txt
git commit -m "Implement new feature"
 
# main 브랜치로 체크아웃
git checkout main
 
# 브랜치 간 차이 비교
git diff main feature
shell

위 명령어는 main 브랜치와 feature 브랜치 간의 차이를 보여줍니다.

diff --git a/feature.txt b/feature.txt
new file mode 100644
index 0000000..c6c6d0d
--- /dev/null
+++ b/feature.txt
@@ -0,0 +1 @@
+New feature
diff

위 diff 결과는 main 브랜치와 feature 브랜치 사이의 차이를 보여줍니다.

diff --git a/feature.txt b/feature.txt는 변경된 파일의 경로를 나타내는데, a/는 첫 번째 브랜치(main), b/는 두 번째 브랜치(feature)를 가리킵니다.

new file mode 100644feature.txt 파일이 feature 브랜치에는 존재하지만 main 브랜치에는 없음을 의미합니다. 여기서 100644는 파일 모드를 나타내는 8진수 값이에요. 이를 이진수로 변환하면 000001000000110100100가 되는데, 각 비트는 다음과 같은 의미를 가지고 있죠.

스티키 비트SETGIDSETUID파일 타입소유자 권한그룹 권한기타 사용자 권한
0001110100100
  • 스티키 비트: 0 (설정되지 않음)
  • SETGID: 0 (설정되지 않음)
  • SETUID: 0 (설정되지 않음)
  • 파일 타입: 1 (일반 파일)
  • 소유자 권한: 110 (읽기, 쓰기)
  • 그룹 권한: 100 (읽기)
  • 기타 사용자 권한: 100 (읽기)

각 권한 비트는 읽기(4), 쓰기(2), 실행(1)의 값을 가지므로, 100644는 다음과 같은 권한을 나타냅니다.

  • 일반 파일
  • 소유자는 읽기/쓰기 권한 (4 + 2 = 6)
  • 그룹과 기타 사용자는 읽기 권한 (4)

index 0000000..c6c6d0d에서 0000000main 브랜치에 파일이 존재하지 않음을, c6c6d0dfeature 브랜치에서의 파일 해시를 의미합니다.

  • -- /dev/null+++ b/feature.txt는 각각 master 브랜치에는 해당 파일이 없고, feature 브랜치에는 feature.txt 파일이 있음을 보여줍니다.

@@ -0,0 +1 @@는 변경된 라인 정보를 나타냅니다. -0,0master 브랜치에서 변경된 라인이 없음을, +1feature 브랜치에서 한 라인이 추가되었음을 의미하죠. 그 아래 +New feature는 추가된 내용이 "New feature"임을 나타냅니다.

이처럼 git diff 명령어를 사용하면 브랜치 간의 차이를 상세히 파악할 수 있어요. 이 정보는 브랜치를 병합하거나 리베이스할 때, 또는 코드 리뷰를 수행할 때 매우 유용하게 활용될 수 있습니다.