Study Programming/Git

Git 파일 다루기3 - 파일 비교하기(diff)

네모메모 2021. 7. 5. 22:39
반응형

 


파일 변경 내용을 git 명령어로도 볼 수도 있지만, 사실 상용제품이 한 눈에 비교가능한 좋은 인터페이스를 제공한다 ㅎㅎ...

 

Git 파일의 변경 내용 보기 : $ git diff 

(=Staged와 Unstaged 상태의 변경 내용을 보기)

- stage되어 커밋가능한 상태의 파일의 수정내용을 확인할 떄 $ git diff 명령어를 사용한다.

 

- $ git status  vs  $ git diff 차이

$ git status 파일이 변경됐다는 사실(파일상태) 확인
$ git diff 파일의 어떤 내용이 변경됐는지 확인

 


 

$ git diff 명령어

1. Working Directory의 파일과 Staging Area의 파일 비교 : $ git diff

      ㄴ> 수정했지만 아직 staged 상태가 아닌 파일이 비교대상 (Unstaged 상태인 변경 부분을 확인)
      ㄴ> Patch처럼 어떤 라인을 추가했고 삭제했는지가 궁금할 때 사용

      ㄴ> ※ git diff 명령은 마지막으로 커밋한 후에 수정한 것들 전부를 보여주지 않는다. git diff 는 Unstaged 상태인 것들만 보여준다. 
               수정한 파일을 모두 Staging Area에 넣었다면 git diff 명령은 아무것도 출력하지 않는다.
               +) git diff 대신 git difftool 명령을 사용해서 emerge, vimdiff 같은 도구로 비교할 수 있다. 상용 제품도 사용할 수 있다.


Ex1~5) Staged에 올린 파일 내용 (삭제/추가/수정/삭제&추가&수정/수정없음)한 파일과 비교하기

(사이트 예제가 이해안가서 만들어 비교했습니다.. -ㅠ- )

 

 Stageing Area에 있는 Staged상태인 'GitDiffTest.txt 파일'이 있다고 가정하자

GitDiffTest.txt  내용 >git status
On branch ch10-java
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   GitDiffTest.txt






line01
line02
line03
line04
line05
line06
line07
line08
line09
line10

 


Ex1) 기존 내용 삭제 후 $ git diff 실행

ㄴ> GitDiffTest.txt 에서 2,3, 8,9행 삭제 후,  git diff 명령어 실행

실제라인 수정전 실제라인 수정후 >git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory
diff --git a/GitDiffTest.txt b/GitDiffTest.txt
index 24a84db..108ce33 100644
--- a/GitDiffTest.txt
+++ b/GitDiffTest.txt
@@ -1,10 +1,6 @@
 line01
-line02
-line03
 line04
 line05
 line06
 line07
-line08
-line09
 line10
1
2
3
4
5
6
7
8
9
10
line01
line02
line03
line04
line05
line06
line07
line08
line09
line10
1
2
3
4
5
6
7
8
9
10
line01
line04
line05
line06
line07
line10




 $git diff 결과 메시지 분석
>git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory

// ▼ diff 비교를 위해 입력된 두 소스 표시
diff --git a/GitDiffTest.txt b/GitDiffTest.txt
// 이 예제 경우 'a/GitDiffTest.txt'파일은 수정 전 파일이고, 'b/GitDiffTest.txt'파일은 수정 후 파일입니다.

index 24a84db..108ce33 100644 // 두 파일의 git객체 버전 해시 식별자 (git 내부적 메타데이터 표시로 딱히 필요는 없을듯)

// ▼ 비교 소스코드 표시마커를 알려준다.
--- a/GitDiffTest.txt     // 'a/GitDiffTest.txt'파일은  ---로 표시할 거란 의미
+++ b/GitDiffTest.txt  // 'b/GitDiffTest.txt'파일은  +++로 표시할 거란 의미

//  'Diff chunks'라고 부르는데 chunk 기준은 모르겠으나, 실제 달라진 diff 부분을 보여주기 위해서 몇 라인 가져왔는지

@@ -1,10 +1,6 @@   
// "-1,10" 의 의미는 '-'로 표시한 수정 전 파일은 1라인부터 10개 라인을 가져와 보여줬다는 의미 (ⓑ번 표의 실제라인 참조)
// "+1,6" 의 의미는 '+'로 표시한 수정 후 파일은 1라인부터 6개 라인을 가져와 보여줬다는 의미  (ⓑ번 표의 실제라인 참조)

//  실제 달라진 diff 부분 표시 
 line01
-line02 // ◀ '-'는 수정 전 'a/GitDiffTest.txt'파일 표시마커이고, 이 파일의 변경사항을 보여준다.
-line03
 line04
 line05
 line06
 line07
-line08
-line09
 line10
 // ▲ 기존 파일 내용을 제거만 했으므로 수정 후 파일의 표시사항('+'기호)은 없다.

 


 

Ex2) 기존 내용 추가 후 $ git diff 실행

ㄴ> GitDiffTest.txt 에서 중간에 3개행 추가 후,  git diff 명령어 실행

실제라인 수정전 실제라인 수정후 >git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory
diff --git a/GitDiffTest.txt b/GitDiffTest.txt
index 24a84db..f2a03fa 100644
--- a/GitDiffTest.txt
+++ b/GitDiffTest.txt
@@ -3,6 +3,9 @@ line02
 line03
 line04
 line05
+line05+1
+line05+2
+line05+3
 line06
 line07
 line08

1
2
3
4
5
6
7
8
9
10
11
12
13
line01
line02
line03
line04
line05
line06
line07
line08
line09
line10



1
2
3
4
5
6
7
8
9
10
11
12
13
line01
line02
line03
line04
line05
line05+1
line05+2
line05+3
line06
line07
line08
line09
line10
 $git diff 결과 메시지 분석
>git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory
// ▼  Ex1의 ⓒ '결과 메시지 분석' 설명 참조
diff --git a/GitDiffTest.txt b/GitDiffTest.txt 
index 24a84db..f2a03fa 100644
--- a/GitDiffTest.txt
+++ b/GitDiffTest.txt

//  diff 부분을 보여주기 위해서 몇 라인 가져왔는지
// "-3,6" : '-' 표시 파일(a/GitDiffTest.txt) 3라인부터 6개 라인을 가져와 보여줬다는 의미 (ⓑ번 표의 실제라인 참조)
// "+3,9" :'+'표시 파일(b/GitDiffTest.txt) 3라인부터 9개 라인을 가져와 보여줬다는 의미  (ⓑ번 표의 실제라인 참조)

@@ -3,6 +3,9 @@ line02 // << "line02"는 왜 여기서부터 붙었는지 모르겠다;;;;;
 line03
 line04
 line05
+line05+1  // ◀ '+'는 수정 파일인 'b/GitDiffTest.txt'파일 표시마커이고, 이 파일의 변경사항을 보여준다.
+line05+2
+line05+3
 line06
 line07
 line08
 // ▲ 현재 파일에 추가만 했으므로 수정 전 파일의 표시사항('-'기호)은 없다.

 

 


Ex3) 기존 내용 수정 후 $ git diff 실행

ㄴ> GitDiffTest.txt 에서 6-8행에서 '0'제거 후,  git diff 명령어 실행

실제라인 수정전 실제라인 수정후 >git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory
diff --git a/GitDiffTest.txt b/GitDiffTest.txt
index 24a84db..df65f38 100644
--- a/GitDiffTest.txt
+++ b/GitDiffTest.txt
@@ -3,8 +3,8 @@ line02
 line03
 line04
 line05
-line06
-line07
-line08
+line6
+line7
+line8
 line09
 line10

1
2
3
4
5
6
7
8
9
10
line01
line02
line03
line04
line05
line06
line07
line08
line09
line10
1
2
3
4
5
6
7
8
9
10
line01
line02
line03
line04
line05
line6
line7
line8
line09
line10
 $git diff 결과 메시지 분석
>git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory
// ▼  Ex1의 ⓒ '결과 메시지 분석' 설명 참조
diff --git a/GitDiffTest.txt b/GitDiffTest.txt
index 24a84db..df65f38 100644
--- a/GitDiffTest.txt
+++ b/GitDiffTest.txt

//diff 부분을 보여주기 위해서3라인부터 8개 라인을 가져와보여줬다는 의미 (ⓑ번 표의 실제라인/실제라인  참조)
@@ -3,8 +3,8 @@ line02 // << "line02"는 왜 여기서부터 붙었는지 모르겠다;;;;;
 line03
 line04
 line05
-line06 // ◀ '-'는 'a/GitDiffTest.txt'파일의 변경사항을 보여준다.
-line07
-line08
+line6 // ◀ '+'는 'b/GitDiffTest.txt'파일의 변경사항을 보여준다.
+line7
+line8
 line09
 line10

 

 


Ex4) 기존 내용 삭제&추가&수정 후 $ git diff 실행

ㄴ> GitDiffTest.txt 에서 (2,8라인 삭제) & (기존 5,7,11라인 자리에 새 내용 추가) & (4,6라인 내용 수정) 후,  git diff 명령어 실행

실제라인 수정전 실제라인 수정후 >git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory
diff --git a/GitDiffTest.txt b/GitDiffTest.txt
index 24a84db..5c4e81b 100644
--- a/GitDiffTest.txt
+++ b/GitDiffTest.txt
@@ -1,10 +1,10 @@
 line01
-line02
 line03
-line04
+line04 + add comment
+add new line05
 line05
-line06
+line06 + add comment
 line07
-line08
+add new line07
 line09
 line10


1
2
3
4
5
6
7
8
9
10




line01
line02
line03
line04
line05
line06
line07
line08
line09
line10




1
2
3
4
5
6
7
8
9
10




line01
line03
line04 + add comment
add new line05
line05
line06 + add comment
line07
add new line07
line09
line10




 $git diff 결과 메시지 분석
> git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory
// ▼  Ex1의 ⓒ '결과 메시지 분석' 설명 참조
diff --git a/GitDiffTest.txt b/GitDiffTest.txt
index 24a84db..df65f38 100644
--- a/GitDiffTest.txt
+++ b/GitDiffTest.txt
@@ -1,10 +1,10 @@

 line01
-line02 // ◀ '-'는 'a/GitDiffTest.txt'파일의 변경사항을 보여준다.
 line03
-line04
+line04 + add comment // ◀ '+'는 'b/GitDiffTest.txt'파일의 변경사항을 보여준다.
+add new line05
 line05
-line06
+line06 + add comment
 line07
-line08
+add new line07
 line09
 line10

 


 

Ex5) 변경 사항이 없을 때 $ git diff 명령어를 사용 : 아래와 같은 메시지를 보여준다.

>git diff
warning: CRLF will be replaced by LF in GitDiffTest.txt.
The file will have its original line endings in your working directory

 

 


 

 

2. Staging Area의 파일과 Git Repository의 파일 비교 : $ git diff --staged 또는 $ git diff --cached

     ㄴ> 저장소에 커밋한 것Staging Area에 있는 것을 비교  (Staged 상태인 파일 확인)

 

Ex2-2) 커밋된 적이 없어 Git Repository에 없고 Staging Area에 있는 GitDiffTest.txt 파일 비교

>git diff --staged
diff --git a/GitDiffTest.txt b/GitDiffTest.txt
new file mode 100644
index 0000000..24a84db
--- /dev/null
+++ b/GitDiffTest.txt
@@ -0,0 +1,10 @@
+line01
+line02
+line03
+line04
+line05
+line06
+line07
+line08
+line09
+line10

 

 


 

 

3. $ git diff 명령어에 대해 더 많은 케이스 작성 블로그

 

https://engineer-mole.tistory.com/130

 

[git] 잘 잊어버리는 사람을 위한 git diff 치트 시트

 git diff는 여러 방면에 정말 자주 쓰이는 것 만큼 할 수 있는 것이 많다보니 쉽게 잊어 버려 매번 검색하곤 했다. 따라서 자주 쓰이는 용법을 한 번 정리해 보았다. git pull 하기 전에 리모트와의

engineer-mole.tistory.com

 

 

 

 

 

 

 


 

 

END!


스터디 도움 참조 블로그 (References)

- 버전 관리(VC) 위키백과
https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC

- 누구나 쉽게 이해할 수 있는 Git 입문
https://backlog.com/git-tutorial/kr/

/입문편/Git의 기본/이력을 관리하는 저장소
https://backlog.com/git-tutorial/kr/intro/intro1_2.html

- git--distributed-even-if-your-workflow-isnt (Pro Git Book)
https://git-scm.com/book/en/v2

- git--distributed-even-if-your-workflow-isnt (Pro Git Book) / ch2.2
https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EC%88%98%EC%A0%95%ED%95%98%EA%B3%A0-%EC%A0%80%EC%9E%A5%EC%86%8C%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0

- What does “@@ -1 +1 @@” mean in Git's diff output?
https://stackoverflow.com/a/31615728

- git-diff 라인별 설명
https://www.atlassian.com/git/tutorials/saving-changes/git-diff

 

반응형