커밋 분석

커밋 기록을 살피기 위한 명령

  • 다음은 커밋 기록을 살피기 위한 명령
  • 모두 커밋참조와 파일(객체)참조를 인수로 받음
명령 설명
git log 과거부터 현재까지의 모든 커밋 기록 보기
git ls-tree 특정 커밋의 스냅샷 파일 목록 보기
git cat-file 특정 커밋의 객체 정보 보기
git show 특정 커밋의 변경 내역 및 파일 내용 보기
git diff 커밋간의 차이 보기

커밋참조

  • 커밋을 참조하는 방법은 2가지
    • 절대참조: 커밋의 해시값
    • 상대참조: 현재 위치로부터 과거의 커밋을 상대적으로 지시
      • HEAD: 현재 체크아웃되어 있는 커밋
      • ~N: 특정 커밋 위치로부터 N번 앞(과거)의 커밋
        • 현재 커밋 바로 앞의 커밋(부모 커밋)은 HEAD~1
        • 현재 커밋 2번재 앞 커밋(조부모 커밋)은 HEAD~2

파일참조

  • 파일을 참조하는 방법은 2가지
    • 절대참조: 파일의 해시값
    • 경로참조: 파일의 이름 또는 경로

실습 1: 레포지토리 생성

  1. 레포지토리 생성
cd $HOME/lab
rm -rf test_commit_01
git init test_commit_01
cd test_commit_01

Initialized empty Git repository in /test_commit_01/.git/

  1. 최초 커밋
echo "file1 line 1" >> file1.txt
git add .
git commit -m c1
[main (root-commit) 39234ea] c1
 1 file changed, 1 insertion(+)
 create mode 100644 file1.txt
echo "file1 line 2" >> file1.txt
echo "file2 line 1" >> file2.txt
git add .
git commit -m c2
[main 5b02c24] c2
 2 files changed, 2 insertions(+)
 create mode 100644 file2.txt
git rm file1.txt
mkdir sub
echo "file3 line 1" >> sub/file3.txt
git add .
git commit -m c3
rm 'file1.txt'
[main 6660489] c3
 2 files changed, 1 insertion(+), 2 deletions(-)
 delete mode 100644 file1.txt
 create mode 100644 sub/file3.txt

그림: 예제 커밋 상황

log 명령

  • 과거부터 현재까지의 모든 커밋 기록 보기

log 명령 사용법

  • git log [옵션] [인수]

log 명령의 인수

  • git log <브랜치이름> -- <파일경로>
  • 특정 브랜치에서 특정 파일이 생성, 변경, 삭제된 커밋 기록만 출력
  • 브랜치 또는 파일 인수 모두 생략 가능

log 명령의 옵션

출력 형식 제어

  • 출력형식은 --pretty 옵션으로 제어
    • --pretty=medium: 기본값 (해시 + 작성자 + 날짜 + 메시지)
    • --pretty=short: 간단한 정보 (해시 + 작성자 + 메시지)
    • --pretty=oneline: 한 줄 출력 (해시 + 메시지)
    • --oneline: 한 줄 출력 (단축해시 + 메시지)
    • --pretty=format: 사용자 정의 형식 출력

출력 내용 제어

  • --stat: 변경 파일 목록 및 간단한 통계

출력 필터링 제어

  • --max-count=개수 또는 -n 개수: 특정 개수의 커밋만 출력.
  • --author="이름": 특정 작성자(committer/author)의 커밋만 출력.
  • --grep="키워드": 커밋 메시지에 키워드가 포함된 것만 검색.
  • --since="2024-01-01": 특정 날짜 이후 커밋만 출력.
  • --until="2024-08-01": 특정 날짜 이전 커밋만 출력.

실습 2: log 명령

git log
commit 6660489fdfaf760a8db454524148a6c817ec18b0 (HEAD -> main)
Author: user <user@company.com>
Date:   Wed Oct 1 22:48:44 2025 +0900

    c3

commit 5b02c241cc4be20435d6b838db6c8e7b374684ef
Author: user <user@company.com>
Date:   Wed Oct 1 22:48:44 2025 +0900

    c2

commit 39234ea9b52058ff5d476057ee12ccedc50c6fa0
Author: user <user@company.com>
Date:   Wed Oct 1 22:48:44 2025 +0900

    c1
git log --pretty=short
commit 6660489fdfaf760a8db454524148a6c817ec18b0 (HEAD -> main)
Author: user <user@company.com>

    c3

commit 5b02c241cc4be20435d6b838db6c8e7b374684ef
Author: user <user@company.com>

    c2

commit 39234ea9b52058ff5d476057ee12ccedc50c6fa0
Author: user <user@company.com>

    c1
git log --pretty=oneline
6660489fdfaf760a8db454524148a6c817ec18b0 (HEAD -> main) c3
5b02c241cc4be20435d6b838db6c8e7b374684ef c2
39234ea9b52058ff5d476057ee12ccedc50c6fa0 c1
git log --oneline
6660489 (HEAD -> main) c3
5b02c24 c2
39234ea c1
git log --pretty=format:"%h %s"
6660489 c3
5b02c24 c2
39234ea c1
git log --oneline --stat
6660489 (HEAD -> main) c3
 file1.txt     | 2 --
 sub/file3.txt | 1 +
 2 files changed, 1 insertion(+), 2 deletions(-)
5b02c24 c2
 file1.txt | 1 +
 file2.txt | 1 +
 2 files changed, 2 insertions(+)
39234ea c1
 file1.txt | 1 +
 1 file changed, 1 insertion(+)
git log --oneline --numstat
6660489 (HEAD -> main) c3
0   2   file1.txt
1   0   sub/file3.txt
5b02c24 c2
1   0   file1.txt
1   0   file2.txt
39234ea c1
1   0   file1.txt
git log --oneline -- file1.txt
6660489 (HEAD -> main) c3
5b02c24 c2
39234ea c1
git log --oneline -- file2.txt
5b02c24 c2

ls-tree 명령

  • 특정 커밋에 포함된 객체의 목록 출력

ls-tree 명령 사용법

  • git ls-tree <커밋> 해당 커밋에 포함된 객체의 목록 출력

ls-tree 명령의 옵션

  • -r <유형>
    • 트리 객체는 생략하고 파일만 하위 디렉토리의 파일까지 출력
    • -r 옵션이 없으면 루트 트리 즉, 최상위 디렉토리의 내용만 출력
  • --name-only <유형>
    • 파일 이름만 출력
    • 생략하면 모드, 객체 유형 및 해시값도 출력

실습 3: ls-tree 명령

git ls-tree HEAD
100644 blob 7a04146eee55f77a1af94221961598f3f9495edc    file2.txt
040000 tree f3460eff5961a211a218462d0b22335667b2da63    sub
git ls-tree --name-only HEAD
file2.txt
sub
git ls-tree -r HEAD
100644 blob 7a04146eee55f77a1af94221961598f3f9495edc    file2.txt
100644 blob 4abff1731a6775f4113f6397bb7d51582c1fae59    sub/file3.txt
git ls-tree -r --name-only HEAD
file2.txt
sub/file3.txt
git ls-tree -r --name-only HEAD~1
file1.txt
file2.txt
git ls-tree -r --name-only HEAD~2
file1.txt

cat-file 명령

  • 커밋에 포함된 객체의 개별 정보 출력

cat-file 명령 사용법

  • git cat-file <커밋참조>:<객체참조>: 커밋에 포함된 객체의 정보를 출력

cat-file 명령의 옵션

  • -p
    • 사람이 읽을 수 있게 파싱하여 출력

실습 4: cat-file 명령

git cat-file -p HEAD:file2.txt
file2 line 1
git cat-file -p HEAD~1:file2.txt
file2 line 1
git cat-file -p HEAD~2:file2.txt || true
fatal: path 'file2.txt' exists on disk, but not in 'HEAD~2'
git cat-file -p HEAD:file1.txt || true
fatal: path 'file1.txt' does not exist in 'HEAD'
git cat-file -p HEAD~1:file1.txt
file1 line 1
file1 line 2
git cat-file -p HEAD~2:file1.txt
file1 line 1

show 명령

  • 특정 커밋과 바로 전 커밋간의 변경 내역 출력 (diff 와 동일)
  • 특정 커밋에 포함된 파일의 내용 출력 (cat-file -p 와 동일)

show 명령 사용법

  • git show <커밋>: 해당 커밋과 바로 전 커밋의 변경 내역 출력. 생략하면 HEAD
  • git show <커밋>:<파일>: 해당 커밋에 포함된 파일의 내용 출력

show 명령의 옵션

  • --name-only <유형>
    • 파일 이름만 출력

실습 5: show 명령

git show HEAD
commit 6660489fdfaf760a8db454524148a6c817ec18b0 (HEAD -> main)
Author: user <user@company.com>
Date:   Wed Oct 1 22:48:44 2025 +0900

    c3

diff --git a/file1.txt b/file1.txt
deleted file mode 100644
index 2d3586b..0000000
--- a/file1.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-file1 line 1
-file1 line 2
diff --git a/sub/file3.txt b/sub/file3.txt
new file mode 100644
index 0000000..4abff17
--- /dev/null
+++ b/sub/file3.txt
@@ -0,0 +1 @@
+file3 line 1
git show --name-status HEAD
commit 6660489fdfaf760a8db454524148a6c817ec18b0 (HEAD -> main)
Author: user <user@company.com>
Date:   Wed Oct 1 22:48:44 2025 +0900

    c3

D   file1.txt
A   sub/file3.txt
git show HEAD:file2.txt
file2 line 1
git show --name-status HEAD~1
commit 5b02c241cc4be20435d6b838db6c8e7b374684ef
Author: user <user@company.com>
Date:   Wed Oct 1 22:48:44 2025 +0900

    c2

M   file1.txt
A   file2.txt