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 diff의 Unified Format 으로 출력이 나옴:
+4는b/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을 읽어볼 것.
Hunk: 파일 내에서 변경된 코드의 한 덩어리(블록)를 의미
https://www.gnu.org/software/diffutils/manual/html_node/Hunks.html
Hunks (Comparing and Merging Files)
1.1 Hunks ¶ When comparing two files, diff finds sequences of lines common to both files, interspersed with groups of differing lines called hunks. Comparing two identical files yields one sequence of common lines and no hunks, because no lines differ. Co
www.gnu.org
https://ohyecloudy.com/ddiary/2024/05/25/til-git-define-custom-hunk-header/
#TIL git diff 문맥 파악에 도움을 주는 hunk-header
git diff에서 변경된 줄을 나타내는 Hunk를 보여준다. @@ -418,6 +418,8 @@ 이런 식으로 라인 넘버를 같이 표시해 준다. 여기에 header를 출력해 변경 사항에 정보를 제공한다. 예를 들어 header에 포함된 함
ohyecloudy.com
이 후, 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 diff의 unified 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
'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 |