본문 바로가기
기타/Git

[Git] diff

by 코딩하는 랄로 2023. 12. 4.
728x90

diff

지금까지 git status를 통해 파일의 변경 사항 등을 확인을 해 왔다. 하지만 git status의 경우, 단순히 파일이 어떻게 변경되었다는 사실만을 알 수 있는데, 만약 파일의 어떤 내용이 변경 되었는지 알고 싶기 위해서는 어떻게 해야 할까?

 

현재 파일이 staged 상태인지 unstaged(modified, untracked) 상태인지를 확인하기 위해서는 status 명령어만으로 충분하지만 해당 파일이 어떻게 변경되었는지 자세히 알아보기 위해서는 git diff 명령어를 사용하여야 한다.

 

해당 명령어를 사용하면 Patch 처럼 어떤 라인이 추가가 되고 삭제가 되었는지를 확인할 수 있다. 이를 위해서 파일 하나를 생성 후, staged 상태로 만든다음 그 파일을 다시 변경하여 보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ echo "version1" > file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git add file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git commit -m "new file"
[master (root-commit) d3abd15] new file
 1 file changed, 1 insertion(+)
 create mode 100644 file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ echo "version2" > file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   file1.txt

no changes added to commit (use "git add" and/or "git commit -a")

 

file1.txt 는 untracked => staged => unmodified => modified 의 상태를 거쳐왔기 때문에 git status 명렁어를 사용하게 되면 위와 같이 modified : file1.txt 문구를 띄우게 된다.

 

이 때 해당 file1.txt 의 구체적으로 어떻게 변경되었는지 알아보기 위해선 git diff 명령어를 사용하면 된다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git diff
diff --git a/file1.txt b/file1.txt
index 5bdcfc1..df7af2c 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1 +1 @@
-version1
+version2

 

git diff 명령어를 사용하게 되면, 워킹 디렉토리에 있는 파일(modified)과 staging area에 있는 파일(변경되기 전 staged 파일) 을 비교하여 그 결과를 보여주게 된다. 출력 결과를 분석해보자.

내용 설명
diff --git a/file1.txt b/file1.txt 비교 대상에 해당하는 파일들을 출력
index 5bdcfc1..df7af2c 100644 해당 파일들의 index 값 (SHA-1 해시 값)
--- a/file1.txt 기존의 staging area에 있는 파일(unmodified 파일)
+++ b/file1.txt working directory에 있는 파일(modified 파일)
@@ -1 +1 @@ 원래의 파일(-) 의 첫번째 줄 부터 보여줌, 바뀐 파일(+)의 첫번째 줄이 바뀜
-version1 원본의 version1 부분이 없어지고
+version2 version2 가 추가되었음을 의미

 

 

 

git diff --staged

위에서 사용한 git diff는 워킹 디렉토리에 있는 modified 파일과 staging area에 있는 staged 파일을 비교하는 명렁어이다. 그렇기 때문에 만약 변경된 파일을 add(staged 상태로 변경)하게 되면 git diff를 하더라도 어떤 변경 사항도 출력하지 않는다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git add file1.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git diff

 

이때 staging area에 올린 staged 파일과 이 전에 커밋한 파일(unmodified)과 비교를 하기위해서는 --staged 옵션을 추가하면 된다. (--cached 옵션도 사용 가능)

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git diff --staged
diff --git a/file1.txt b/file1.txt
index 5bdcfc1..df7af2c 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1 +1 @@
-version1
+version2

 

다시 변경 사항이 출력되는 것을 볼 수 있다. 여기서 staged 상태의 파일과 이전 커밋한 파일(unmodified)의 차이가 무엇인지 아직 모르는 분들이 있을 수 있다. 기본적으로 git은 add 명령어를 통해 staging area에 파일을 올릴 때 스냅샷을 생성하기 때문에 지금 현재 commit 되어 있는 file1.txt 파일은 이전의 file1.txt를 add 할 때의 상태인 것이다.

 

그렇기 때문에 --staged 옵션을 사용하여 git diff를 출력하였을 때, 위와 같은 결과를 출력하는 것이다. 여기서 file1.txt를 unmodified 상태로 만들게 되면 --staged 옵션을 사용하여도 변경사항을 출력하지 않는다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git commit -m "modified file"
[master a01c7ea] modified file
 1 file changed, 1 insertion(+), 1 deletion(-)

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git diff --staged

 

 

 

 

 

reference : pro git

728x90

'기타 > Git' 카테고리의 다른 글

[Git] rm  (0) 2023.12.14
[Git] Commit  (2) 2023.12.06
[Git] .gitignore  (2) 2023.11.26
[Git] status --short  (1) 2023.11.26
[Git] add  (1) 2023.11.26