본문 바로가기
목차
utils/git and github

git diff

by ds31x 2024. 5. 20.
728x90
반응형

git diff

git diff 명령어를 사용하면 어떤 라인이 추가되었는지, 삭제되었는지, 수정되었는지 등의 차이를 알 수 있음.

  • Git에서 두 버전의 파일을 비교하여 차이를 보여주는 명령어
  • 변경된 내용이 어떤 것인지를 보여줌.
  • 수정이력을 commit 단위로 비교하여 보여줌.

참고로 vscode와 같은, 외부 도구로 diff를 수행하려면 git difftool 을 사용하면 된다.

2025.07.22 - [utils/git and github] - git difftool 과 git mergetool

 

git difftool 과 git mergetool

정의git에서 diff 대신에 외부 도구를 이용하여 비교할 수 있게 해주는 명령어가 difftool임.여러 tool이 있지만, vscode를 사용한다면 이를 지정할 수 있음git diff : 현재 변경사항을 text 기반으로git difft

ds31x.tistory.com

  • Jupyter Notebook 의 .ipynb의 활용범위가 높아지면서 git difftool의 중요도가 커짐.
  • vscode 등의 tool에서 제공하는 diff 기능에서 ipynb 비교가 보다 확인하기 쉽다. 
  • .ipynb에선 git difftool을 사용하길 권함.
diffing이라는 용어는
diff 등의 명령어로 두 대상의 차이를 확인하는 것을 가리키는 개발자 비공식 용어임.
computing a diff 나 compare changes, generating a diff, comparing versions (or files)가 권장되는 표현이나...
더 흔하게 diffing 을 자주 볼 수 있음.

usage

  • 옵션 없이 사용"Working tree" "Stage" 에 있는 같은 파일의 차이점 확인.
    • Unstaged 상태인 파일들의 수정사항을 보여줌.
  • --staged 옵션을 사용할 경우, "Stage" "repository (HEAD)" 에 있는 같은 파일의 차이점 확인.
  • git diff HEAD 로 사용시, "working tree와 Stage를 포함한 것" 최신 commit (HEAD 가 가리키고 있는 commit)와의 차이점을 확인.
명령어 기준 (old file, left. a로 표시) 대상 (new file, right. b로 표시)
git diff (옵션 없음) Working Tree 이전 상태(=Index) Working Tree 현재 상태
git diff --staged HEAD(=repository) Index(Stage)
git diff HEAD HEAD(=repository) Working Tree 전체(=Index 포함)
  • 비교할 대상을 left(a로 표시), right(b로 표시)의 두개의 인자로도 받을 수 있음.
  • 주로 대상에 부여된 SHA1 (=hash) 값을 사용함: sha1에 대한 자세한 건 다음을 참고(https://ds31x.tistory.com/283)

보다 자세한 사용법은 아래의 Summary 참고할 것.


아래 예제는 다음 글의 예제에서 이어짐: 2024.05.20 - [utils/git and github] - [Git] commit


Example

Working tree에서 first_file.txt에 4번째 라인에 4 라는 글자를 추가 후 git status로 확인하면 다음과 같음.

  • 여기서 new_file.txt가 modified 됨을 확인할 수 있음.
  • 어떤 부분이 변경되었는지 (working tree와 stage의 차이점 확인)는 git diff로 확인 가능함.

GNU diffUnified Format 으로 출력이 나옴:

  • +4b/new_file.txt에 추가된 부분을 의미함.
  • a/ : before change 를 나타내는 prefix (기준!)
  • b/ : after change 를 나타내는 prefix (대상!)
  • index로 시작되는 행은 파일의 해시값(이전/이후 상태) 및 권한 (100644: 일반 텍스트 파일)을 나타냄: commit의 hash가 아님.
  • @@ -1,3 +1,4 @@ : 변경된 줄 범위(hunk header) 
    • 좌측: - 기호는 old파일(a)을 의미, 이전 파일 기준 줄 번호와 개수 
    • 우측: +기호는 new파일(b)을 의미, 변경 후 파일 기준 줄 번호와 개수

hunk header에 대한 내용을 좀더 살펴보려면 다음 접은 글을 열고 관련 url을 읽어볼 것.

더보기

 

이 후, working tree에 추가된 부분을 version 관리에 추가하려면 git add, git commit을 사용.

  • 여러 파일들을 수정하는 작업을 했는데, 문제가 발생하여 소스가 정상 동작하지 않을 경우,
    지금까지 이루어진 변경사항을 취소하고 "commit 된 최신 version"으로 되돌리는 작업 수행.
  • Git 2.23.0 이전에는 이를 위해 git checkout 을 사용하였으나
  • 현재 working tree내용을 버리려면, git restore을 사용.
  • 2.23.0부터 checkout은 branch를 생성하거나 branch로 이동하는 경우에만 사용되고,
    변경내용 취소하는 기능은 git restore로 분리됨.

Summary

git diff

  • branch간의 차이점이나,
  • 현재 working tree와 특정 branch 와의 차이 등을 보는 데에도 사용됨.

1. 현재 작업 디렉토리의 변경 사항 확인

working directory와 stage (or index) 사이의 차이를 보여줍니다.

  • a/: staging area
  • b/: working tree
git diff

 


2. stage 영역과 최신 commit 사이의 변경 사항 확인

스테이징된 파일들과 최신 커밋 사이의 차이를 보여줍니다.

  • a/: HEAD commit
  • b/: staging area
git diff --staged

 

또는

git diff --cached

3. working tree와 최신 commit 사이의 변경 사항 확인

  • a/: HEAD commit
  • b/: working tree
git diff HEAD

4. 특정 파일의 변경 사항 확인

특정 파일의 변경 사항만 보고 싶을 때 사용합니다.

  • a/: staging area(= index)의 특정 파일
  • b/: working tree의 특정파일
git diff 파일명

5. 두 커밋 사이의 변경 사항 확인

두 커밋 사이의 변경 사항을 비교합니다.

git diff 커밋1(base) 커밋2(target)
  • hash 값으로 커밋1 과 커밋2를 지정.
  • git log를 통해 확인 가능한 commit id (SHA1 hash value)가 hash값임.
  • a/ 는 커밋1, b/ 는 커밋2 임.

아래와 같이 상대참조 (HEAD 기준)를 사용할 수 있음

git diff HEAD~1 HEAD  
  • 위 명령어는 바로 이전 커밋과 현재 커밋 사이의 변경 사항을 비교.
  • HEAD~n 에서 n은 int 이며, HEAD 기준으로 n단계 이전의 ancestor commit (parent commit을 의미하는 caret ^과 조금 다름)을 의미함.

6. 브랜치 간의 변경 사항 확인

두 브랜치 사이의 차이를 비교.

  • a/: 브랜치1
  • b/: 브랜치2
git diff 브랜치1 브랜치2

관련 추가 옵션

  • --name-only: 변경된 파일 이름만 보여줌.
  • --name-status: 변경된 파일 이름과 변경 상태(추가, 수정, 삭제)를 보여줌.
  • --stat: 변경된 파일의 통계 정보(몇 줄이 추가되었고, 몇 줄이 삭제되었는지)를 보여줌.
  • -p: 패치 형식으로 변경 사항을 보여줌=GNU diffunified format으로 출력을 의미함.
    • diff에선 안 붙여도 차이 없음.
    • log 등에서 사용할 수 있는 옵션임.
    • By default, git diff shows the differences in patch form (-p).

이 외에도 다양한 옵션들이 있으니, git diff --help 명령어를 사용하여 추가적인 옵션을 확인해 보는 걸 권함.


같이보면 좋은 자료들

2024.05.20 - [utils/git and github] - [Git] Git Summary (작성중)

 

[Git] Git Summary (작성중)

git이란2024.05.20 - [utils/git and github] - Git : 소개 git 설치 후 해줘야 하는 작업들[Git] git 설치 후 우선 해줘야 하는 작업들 (tistory.com)local repository 초기화2024.05.20 - [utils/git and github] - [Git] init : local repo

ds31x.tistory.com

 

728x90

'utils > git and github' 카테고리의 다른 글

git rm  (0) 2024.05.21
[Git] git 설치 후 우선 해줘야 하는 작업들  (0) 2024.05.21
[Git] Git Summary (작성중)  (0) 2024.05.20
git commit —amend  (0) 2024.05.20
git commit  (0) 2024.05.20