cd $HOME/lab
rm -rf test_commit_01
git init test_commit_01
cd test_commit_01커밋 분석
커밋 기록을 살피기 위한 명령
- 다음은 커밋 기록을 살피기 위한 명령
- 모두 커밋참조와 파일(객체)참조를 인수로 받음
| 명령 | 설명 |
|---|---|
git log |
과거부터 현재까지의 모든 커밋 기록 보기 |
git ls-tree |
특정 커밋의 스냅샷 파일 목록 보기 |
git cat-file |
특정 커밋의 객체 정보 보기 |
git show |
특정 커밋의 변경 내역 및 파일 내용 보기 |
git diff |
커밋간의 차이 보기 |
커밋참조
- 커밋을 참조하는 방법은 2가지
- 절대참조: 커밋의 해시값
- 상대참조: 현재 위치로부터 과거의 커밋을 상대적으로 지시
HEAD: 현재 체크아웃되어 있는 커밋~N: 특정 커밋 위치로부터 N번 앞(과거)의 커밋- 현재 커밋 바로 앞의 커밋(부모 커밋)은
HEAD~1 - 현재 커밋 2번재 앞 커밋(조부모 커밋)은
HEAD~2
- 현재 커밋 바로 앞의 커밋(부모 커밋)은
파일참조
- 파일을 참조하는 방법은 2가지
- 절대참조: 파일의 해시값
- 경로참조: 파일의 이름 또는 경로
실습 1: 레포지토리 생성
- 레포지토리 생성
Initialized empty Git repository in /test_commit_01/.git/
- 최초 커밋
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 c3rm '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 logcommit 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=shortcommit 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=oneline6660489fdfaf760a8db454524148a6c817ec18b0 (HEAD -> main) c3
5b02c241cc4be20435d6b838db6c8e7b374684ef c2
39234ea9b52058ff5d476057ee12ccedc50c6fa0 c1
git log --oneline6660489 (HEAD -> main) c3
5b02c24 c2
39234ea c1
git log --pretty=format:"%h %s"6660489 c3
5b02c24 c2
39234ea c1
git log --oneline --stat6660489 (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 --numstat6660489 (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.txt6660489 (HEAD -> main) c3
5b02c24 c2
39234ea c1
git log --oneline -- file2.txt5b02c24 c2
ls-tree 명령
- 특정 커밋에 포함된 객체의 목록 출력
ls-tree 명령 사용법
git ls-tree <커밋>해당 커밋에 포함된 객체의 목록 출력
ls-tree 명령의 옵션
-r<유형>- 트리 객체는 생략하고 파일만 하위 디렉토리의 파일까지 출력
-r옵션이 없으면 루트 트리 즉, 최상위 디렉토리의 내용만 출력
--name-only<유형>- 파일 이름만 출력
- 생략하면 모드, 객체 유형 및 해시값도 출력
실습 3: ls-tree 명령
git ls-tree HEAD100644 blob 7a04146eee55f77a1af94221961598f3f9495edc file2.txt
040000 tree f3460eff5961a211a218462d0b22335667b2da63 sub
git ls-tree --name-only HEADfile2.txt
sub
git ls-tree -r HEAD100644 blob 7a04146eee55f77a1af94221961598f3f9495edc file2.txt
100644 blob 4abff1731a6775f4113f6397bb7d51582c1fae59 sub/file3.txt
git ls-tree -r --name-only HEADfile2.txt
sub/file3.txt
git ls-tree -r --name-only HEAD~1file1.txt
file2.txt
git ls-tree -r --name-only HEAD~2file1.txt
cat-file 명령
- 커밋에 포함된 객체의 개별 정보 출력
cat-file 명령 사용법
git cat-file <커밋참조>:<객체참조>: 커밋에 포함된 객체의 정보를 출력
cat-file 명령의 옵션
-p- 사람이 읽을 수 있게 파싱하여 출력
실습 4: cat-file 명령
git cat-file -p HEAD:file2.txtfile2 line 1
git cat-file -p HEAD~1:file2.txtfile2 line 1
git cat-file -p HEAD~2:file2.txt || truefatal: path 'file2.txt' exists on disk, but not in 'HEAD~2'
git cat-file -p HEAD:file1.txt || truefatal: path 'file1.txt' does not exist in 'HEAD'
git cat-file -p HEAD~1:file1.txtfile1 line 1
file1 line 2
git cat-file -p HEAD~2:file1.txtfile1 line 1
show 명령
- 특정 커밋과 바로 전 커밋간의 변경 내역 출력 (diff 와 동일)
- 특정 커밋에 포함된 파일의 내용 출력 (cat-file -p 와 동일)
show 명령 사용법
git show <커밋>: 해당 커밋과 바로 전 커밋의 변경 내역 출력. 생략하면 HEADgit show <커밋>:<파일>: 해당 커밋에 포함된 파일의 내용 출력
show 명령의 옵션
--name-only<유형>- 파일 이름만 출력
실습 5: show 명령
git show HEADcommit 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 HEADcommit 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.txtfile2 line 1
git show --name-status HEAD~1commit 5b02c241cc4be20435d6b838db6c8e7b374684ef
Author: user <user@company.com>
Date: Wed Oct 1 22:48:44 2025 +0900
c2
M file1.txt
A file2.txt