🔥 git diff
개발자들이 소스 코드를 수정하다 보면 코드 변경 내역을 확인해야 할 때가 많습니다. 이럴 때 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 100644
는 feature.txt
파일이 feature
브랜치에는 존재하지만 main
브랜치에는 없음을 의미합니다. 여기서 100644
는 파일 모드를 나타내는 8진수 값이에요. 이를 이진수로 변환하면 000001000000110100100
가 되는데, 각 비트는 다음과 같은 의미를 가지고 있죠.
스티키 비트 | SETGID | SETUID | 파일 타입 | 소유자 권한 | 그룹 권한 | 기타 사용자 권한 |
---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 110 | 100 | 100 |
- 스티키 비트: 0 (설정되지 않음)
- SETGID: 0 (설정되지 않음)
- SETUID: 0 (설정되지 않음)
- 파일 타입: 1 (일반 파일)
- 소유자 권한: 110 (읽기, 쓰기)
- 그룹 권한: 100 (읽기)
- 기타 사용자 권한: 100 (읽기)
각 권한 비트는 읽기(4), 쓰기(2), 실행(1)의 값을 가지므로, 100644
는 다음과 같은 권한을 나타냅니다.
- 일반 파일
- 소유자는 읽기/쓰기 권한 (4 + 2 = 6)
- 그룹과 기타 사용자는 읽기 권한 (4)
index 0000000..c6c6d0d
에서 0000000
은 main
브랜치에 파일이 존재하지 않음을, c6c6d0d
는 feature
브랜치에서의 파일 해시를 의미합니다.
-- /dev/null
과+++ b/feature.txt
는 각각master
브랜치에는 해당 파일이 없고,feature
브랜치에는feature.txt
파일이 있음을 보여줍니다.
@@ -0,0 +1 @@
는 변경된 라인 정보를 나타냅니다. -0,0
은 master
브랜치에서 변경된 라인이 없음을, +1
은 feature
브랜치에서 한 라인이 추가되었음을 의미하죠. 그 아래 +New feature
는 추가된 내용이 "New feature"임을 나타냅니다.
이처럼 git diff
명령어를 사용하면 브랜치 간의 차이를 상세히 파악할 수 있어요. 이 정보는 브랜치를 병합하거나 리베이스할 때, 또는 코드 리뷰를 수행할 때 매우 유용하게 활용될 수 있습니다.