git diff

명령어 설명

git의 세 가지 저장 공간 간 (작업 디렉터리 - 스테이지 영역 - 깃 저장소) 의 차이를 비교하는 명령이다.

-두 파일이 같으면 출력 결과에 아무 것도 표시되지 않는다.
-두 파일이 다르면 출력 결과에 차이 사항이 표시된다.

기본 사용법과 출력 해석

1
git diff [option]

옵션

옵션 full name 설명
없음   작업 디렉터리와 스테이지 영역 간의 차이 확인
-> 스테이지 영역에 올라가지 않은 변경 사항이 출력된다.
--staged or --cached
--staged HEAD
--cached HEAD
  스테이지 영역과 마지막 커밋 간의 차이 확인
HEAD   작업 디렉터리와 마지막 커밋 간의 차이 확인
HEAD HEAD~   현재 커밋과 직전 커밋 간의 차이 확인
<file name>   특정 파일에 대한 변경 내용 확인
<commit1> <commit2>   두 특정 커밋 간의 차이 비교
<branch1> <branch2>   두 특정 브랜치 간의 차이 비교

출력 해석

1
2
3
4
5
6
7
diff --git a/example.txt b/example.txt
index 83db48f..e2c4e60 100644
--- a/example.txt
+++ b/example.txt
@@ -1,4 +1,4 @@
- Hello World!
+ Hello Git!
항목 해석
diff –git a/example.txt b/example.txt - 두 파일 a/example.txt b/example.txt 를 비교하고 있다.
- git은 변경 전 파일을 a/ 변경 후 파일을 b/로 표시한다.
index 83db48f..e2c4e60 100644 - 비교하는 변경 전후 두 파일의 commit ID 값이다.
- 100644는 파일 권한으로, 일반적인 읽기-쓰기 가능을 의미한다. (리눅스의 644 mode와 동일)
— a/example.txt 변경 전 파일의 경로로, ---이전 파일 을 나타낸다.
+++ b/example.txt 변경 후 파일의 경로로, +++이후 파일 을 나타낸다.
@@ -1,4 +1,4 @@ 변경된 코드 영역의 문맥(context) 정보이다.
-1,4 : 변경 전 파일의 코드 영역이 1번 줄부터 4줄이 포함된 영역임을 뜻한다.
+1,4 : 변경 후 파일의 코드 영역이 1번 줄부터 4줄이 포함된 영역임을 뜻한다.
@@ 는 변경 영역의 시작을 나타낸다.
- Hello World! 변경 전 파일에 있던 내용을 뜻한다.
- 는 삭제된 내용을 뜻한다.
+ Hello Git! 변경 후 파일에 있는 내용을 뜻한다.
+ 는 추가된 내용을 뜻한다.

예시

예시 깃 저장소

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 첫 번째 커밋 : 파일 생성
echo '#!/bin/bash' > test.sh
git add ./test.sh
git commit -m "first commit"

# 두 번째 커밋 : 파일 수정
echo "echo Hello Linux" >> test.sh
git commit -am "second commit"

# 세 번째 커밋 : 파일 수정
echo 'echo $0 $1 $2' >> test.sh
git commit -am "third commit"

# 네 번째 커밋 : 새로운 브랜치를 생성 + HEAD 이동 + 파일 수정
git checkout HEAD~
git checkout main
git checkout HEAD~1
git checkout -b new_branch
echo "another branch" >> ./test.sh
git commit -am "4th commit at new branch"
1
2
3
4
5
6
7
8
9
# 다시 main 브랜치로 이동
git checkout main

# 추가로 파일을 수정하고 스테이지 영역으로 올림
echo "diff test" >> test.sh
git add ./test.sh

# 추가로 파일을 수정
echo "diff test - unstaged" >> test.sh

(1) 옵션 없음 : 스테이지 영역에 올라가지 않은 변경 사항 확인

1
2
3
4
5
6
7
8
9
10
11
12
# (1)  옵션 없음 : 스테이지 영역에 올라가지 않은 변경 사항 확인
git diff
>> diff --git a/test.sh b/test.sh
>> index 3889052..4d7d02a 100644
>> --- a/test.sh
>> +++ b/test.sh
>> @@ -2,3 +2,4 @@
>>  echo Hello Linux
>>  echo $0 $1 $2
>>  diff test
>> +diff test - unstaged

(2) cached, staged : 스테이지 영역과 마지막 커밋 간 차이

1
2
3
4
5
6
7
8
9
10
11
12
13
# (2) cached, staged : 스테이지 영역과 마지막 커밋 간 차이
git diff --cached # git diff --staged 와 동일
>> diff --git a/test.sh b/test.sh
>> index 20c3a07..3889052 100644
>> --- a/test.sh
>> +++ b/test.sh
>> @@ -1,3 +1,4 @@
>>  \#!/bin/bash
>>  echo Hello Linux
>>  echo $0 $1 $2
>> +diff test

(3) HEAD : 작업 디렉터리와 마지막 커밋 간의 차이 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
# (3) HEAD : 작업 디렉터리와 마지막 커밋 간의 차이 확인
git diff HEAD
>> diff --git a/test.sh b/test.sh
>> index 20c3a07..4d7d02a 100644
>> --- a/test.sh
>> +++ b/test.sh
>> @@ -1,3 +1,5 @@
>>  \#!/bin/bash
>>  echo Hello Linux
>>  echo $0 $1 $2
>> +diff test
>> +diff test - unstaged

(4) HEAD HEAD~ : 현재 커밋과 직전 커밋 간의 차이 확인

1
2
3
4
5
6
7
8
9
10
# (4) HEAD HEAD~ : 현재 커밋과 직전 커밋 간의 차이 확인
git diff HEAD HEAD~
>> diff --git a/test.sh b/test.sh
>> index 20c3a07..29446b0 100644
>> --- a/test.sh
>> +++ b/test.sh
>> @@ -1,3 +1,2 @@
>>  \#!/bin/bash
>>  echo Hello Linux
>> -echo $0 $1 $2

(5) commit1 commit2 : 두 특정 커밋 간의 차이 비교

1
2
3
4
5
6
7
8
9
10
# (5) commit1 commit2 : 두 특정 커밋 간의 차이 비교
git diff 4130 37b9
>> diff --git a/test.sh b/test.sh
>> index 0bf81b3..a9bf588 100644
>> --- a/test.sh
>> +++ b/test.sh
>> @@ -1,3 +1 @@
>>  \#!/bin/bash
>> -echo Hello Linux
>> -another branch

(6) branch1 branch2 : 두 특정 브랜치 간의 차이 비교

1
2
3
4
5
6
7
8
9
10
11
# (6) branch1 branch2 : 두 특정 브랜치 간의 차이 비교
git diff main new_branch
>> diff --git a/test.sh b/test.sh
>> index 20c3a07..0bf81b3 100644
>> --- a/test.sh
>> +++ b/test.sh
>> @@ -1,3 +1,3 @@
>>  \#!/bin/bash
>>  echo Hello Linux
>> -echo $0 $1 $2
>> +another branch

예시의 전체 상태 도식화

Reference

UNIX시스템 - 김희천,김진욱 저