포스트

[GitHub 100일 챌린지] Day 37 - git log 히스토리 보기

[GitHub 100일 챌린지] Day 37 - git log 히스토리 보기

100일 챌린지 Day 37 - 커밋 히스토리를 다양한 방식으로 조회합니다

배울 내용

  1. log 기본 사용법
  2. log 포맷 옵션
  3. log 필터링

Topic1. log 기본 사용법

git log = 커밋 히스토리 조회

프로젝트의 모든 커밋 기록을 확인하는 필수 명령어입니다.

기본 사용법

1
git log

출력 예시:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
commit a1b2c3d4e5f6g7h8i9j0 (HEAD -> main, origin/main)
Author: Your Name <you@example.com>
Date:   Wed Feb 5 14:30:00 2025 +0900

    Add login feature

    - Implement user authentication
    - Add login form
    - Add session management

commit k9l8m7n6o5p4q3r2s1t0
Author: Your Name <you@example.com>
Date:   Wed Feb 5 10:15:00 2025 +0900

    Update README

commit u0v9w8x7y6z5a4b3c2d1
Author: Team Member <team@example.com>
Date:   Tue Feb 4 16:45:00 2025 +0900

    Fix bug in payment module

출력 구조

각 커밋 정보:

1
2
3
4
5
6
7
commit [SHA-1 해시]       # 커밋 고유 ID
Author: [이름 <이메일>]    # 작성자
Date:   [날짜 시간]         # 커밋 시점
                          # 빈 줄
    [커밋 메시지]          # 제목
                          # 빈 줄
    [상세 설명]            # 본문 (선택)

HEAD와 브랜치 표시:

1
(HEAD -> main, origin/main)

의미:

  • HEAD: 현재 위치
  • main: 로컬 main 브랜치
  • origin/main: Remote main 브랜치

간결한 출력 (oneline)

1
git log --oneline

출력:

1
2
3
4
a1b2c3d (HEAD -> main) Add login feature
k9l8m7n Update README
u0v9w8x Fix bug in payment module
e4f5g6h Initial commit

장점:

  • 한 줄에 하나의 커밋
  • 짧은 해시 (7자리)
  • 커밋 메시지 제목만
  • 전체 흐름 파악에 유리

개수 제한

1
2
3
4
5
# 최근 5개
git log -5

# oneline + 최근 3개
git log --oneline -3

상세 정보 보기

1
2
3
4
5
6
7
8
9
10
11
12
13
# 변경된 파일 통계
git log --stat

# 출력:
commit a1b2c3d
Author: Your Name <you@example.com>
Date:   Wed Feb 5 14:30:00 2025 +0900

    Add login feature

 src/auth.js    | 45 +++++++++++++++++++++
 src/login.html | 23 +++++++++++
 2 files changed, 68 insertions(+)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 변경 내용 diff까지
git log -p

# 출력: 각 커밋마다 전체 diff 표시
commit a1b2c3d
...
diff --git a/src/auth.js b/src/auth.js
new file mode 100644
index 0000000..1234567
--- /dev/null
+++ b/src/auth.js
@@ -0,0 +1,45 @@
+function login(username, password) {
+  // ...
+}

해보기: 다양한 log 형식 비교

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 기본 log
git log

# 2. 간결한 log
git log --oneline

# 3. 최근 5개만
git log --oneline -5

# 4. 통계 포함
git log --stat -2

# 5. diff 포함 (주의: 출력 많음)
git log -p -1

결과: 상황에 맞는 log 형식을 선택할 수 있습니다


Topic2. log 포맷 옵션

log 포맷 = 원하는 정보만 보기

커스터마이징을 통해 필요한 정보만 효율적으로 확인합니다.

graph 옵션 (브랜치 시각화)

1
git log --oneline --graph

출력:

1
2
3
4
5
6
7
* a1b2c3d (HEAD -> main) Merge branch 'feature'
|\
| * k9l8m7n Add feature B
| * u0v9w8x Add feature A
|/
* e4f5g6h Update README
* h7i8j9k Initial commit

브랜치 구조:

1
2
3
main:     *---*---*---M (Merge)
              \     /
feature:       *---*

decorate 옵션 (브랜치/태그 표시)

1
git log --oneline --decorate

출력:

1
2
3
a1b2c3d (HEAD -> main, origin/main, tag: v1.0) Release v1.0
k9l8m7n (feature) Add new feature
u0v9w8x Fix critical bug

all 옵션 (모든 브랜치)

1
git log --oneline --graph --all

출력:

1
2
3
4
5
6
7
* a1b2c3d (HEAD -> main, origin/main) Latest main
| * k9l8m7n (feature) Feature work
|/
* u0v9w8x Common ancestor
| * e4f5g6h (hotfix) Urgent fix
|/
* h7i8j9k Initial commit

모든 브랜치의 커밋을 함께 표시합니다.

format 옵션 (커스텀 포맷)

기본 플레이스홀더:

1
2
3
4
5
6
7
%H  = 전체 커밋 해시
%h  = 짧은 커밋 해시
%an = 작성자 이름
%ae = 작성자 이메일
%ad = 작성 날짜
%s  = 커밋 메시지 제목
%b  = 커밋 메시지 본문

예시 1: 간결한 포맷:

1
2
3
4
5
6
git log --format="%h - %s (%an)"

# 출력:
a1b2c3d - Add login feature (Your Name)
k9l8m7n - Update README (Your Name)
u0v9w8x - Fix bug (Team Member)

예시 2: 상세 포맷:

1
2
3
4
5
6
git log --format="%h | %ad | %an | %s" --date=short

# 출력:
a1b2c3d | 2025-02-05 | Your Name | Add login feature
k9l8m7n | 2025-02-05 | Your Name | Update README
u0v9w8x | 2025-02-04 | Team Member | Fix bug

예시 3: JSON 스타일:

1
2
3
4
5
git log --format='{"hash":"%h","author":"%an","date":"%ad","message":"%s"}' --date=iso

# 출력:
{"hash":"a1b2c3d","author":"Your Name","date":"2025-02-05 14:30:00 +0900","message":"Add login feature"}
{"hash":"k9l8m7n","author":"Your Name","date":"2025-02-05 10:15:00 +0900","message":"Update README"}

날짜 형식 옵션

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 기본 형식
git log --date=default

# ISO 8601 형식
git log --date=iso
# 2025-02-05 14:30:00 +0900

# 짧은 형식
git log --date=short
# 2025-02-05

# 상대 시간
git log --date=relative
# 2 hours ago

# RFC 형식
git log --date=rfc
# Wed, 5 Feb 2025 14:30:00 +0900

# 유닉스 타임스탬프
git log --date=unix
# 1738735800

실전 포맷 조합

개발자용 요약:

1
git log --oneline --graph --decorate --all -10

릴리스 노트용:

1
git log --format="- %s (%h)" v1.0..v2.0

커밋 통계:

1
2
3
4
5
6
git log --format="%an" | sort | uniq -c | sort -rn

# 출력:
15 Your Name
8 Team Member A
3 Team Member B

해보기: 유용한 포맷 설정

1
2
3
4
5
6
7
8
9
10
11
# 1. 그래프 + 색상
git log --oneline --graph --all --decorate

# 2. 커스텀 포맷
git log --format="%C(yellow)%h%C(reset) - %s %C(green)(%cr)%C(reset) %C(blue)<%an>%C(reset)" -5

# 3. Alias 설정 (추천!)
git config --global alias.lg "log --oneline --graph --all --decorate"

# 4. 사용
git lg

결과: 프로젝트 히스토리를 시각적으로 이해할 수 있습니다


Topic3. log 필터링

log 필터링 = 원하는 커밋만 찾기

방대한 히스토리에서 필요한 정보만 추출합니다.

시간 기반 필터링

특정 날짜 이후:

1
2
3
4
5
6
7
8
# 2025년 2월 1일 이후
git log --since="2025-02-01"

# 1주일 전부터
git log --since="1 week ago"

# 3일 전부터
git log --since="3 days ago"

특정 날짜 이전:

1
2
3
4
5
# 2025년 1월 31일까지
git log --until="2025-01-31"

# 어제까지
git log --until="yesterday"

기간 지정:

1
2
3
4
5
# 2월 1일 ~ 2월 5일
git log --since="2025-02-01" --until="2025-02-05"

# 지난주
git log --since="1 week ago" --until="yesterday"

작성자 기반 필터링

1
2
3
4
5
6
7
8
9
10
11
# 특정 작성자
git log --author="Your Name"

# 정규식 사용
git log --author="Your.*"

# 여러 작성자 (OR)
git log --author="Your Name\|Team Member"

# 제외
git log --author="^(?!Your Name).*"

커밋 메시지 기반 필터링

1
2
3
4
5
6
7
8
9
10
11
# 메시지에 "fix" 포함
git log --grep="fix"

# 대소문자 무시
git log --grep="FIX" -i

# 여러 키워드 (OR)
git log --grep="fix\|bug"

# AND 조건
git log --grep="login" --grep="feature" --all-match

파일 기반 필터링

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 특정 파일 변경 이력
git log -- path/to/file.js

# 여러 파일
git log -- file1.js file2.js

# 디렉토리
git log -- src/

# 삭제된 파일 포함
git log --all -- deleted-file.js

# 파일 변경 내용 포함
git log -p -- file.js

변경 내용 기반 필터링

특정 코드 변경:

1
2
3
4
5
# "function login" 추가/삭제된 커밋
git log -S "function login"

# 정규식 사용
git log -G "function.*login"

차이:

1
2
-S: 정확한 문자열 매칭
-G: 정규식 패턴 매칭

브랜치 기반 필터링

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# main에는 없고 feature에만 있는 커밋
git log main..feature

# feature에는 없고 main에만 있는 커밋
git log feature..main

# main과 feature의 차이 (양방향)
git log main...feature

# 특정 커밋부터
git log a1b2c3d..HEAD

# 태그 사이
git log v1.0..v2.0

병합 커밋 필터링

1
2
3
4
5
6
7
8
# 병합 커밋만
git log --merges

# 병합 커밋 제외
git log --no-merges

# 병합 커밋의 양쪽 부모 표시
git log --merges --parents

복합 필터링

실전 예시 1: 특정 작성자의 최근 버그 수정:

1
git log --author="Your Name" --grep="fix\|bug" --since="1 month ago" --oneline

실전 예시 2: 특정 파일의 최근 변경 (작성자별):

1
git log --format="%h - %an: %s" --since="2 weeks ago" -- src/auth.js

실전 예시 3: 릴리스 간 주요 변경사항:

1
git log v1.0..v2.0 --no-merges --format="- %s (%h)" --grep="feat:"

실전 예시 4: 특정 함수 변경 이력:

1
git log -S "function calculateTotal" -p -- src/

고급 필터링

첫 번째/마지막 커밋 찾기:

1
2
3
4
5
# 첫 커밋
git log --reverse --oneline | head -1

# 마지막 커밋
git log -1 --oneline

커밋 개수 세기:

1
2
3
4
5
6
7
8
9
10
# 전체 커밋 수
git log --oneline | wc -l

# 특정 기간
git log --since="1 month ago" --oneline | wc -l

# 작성자별
git shortlog -sn
# 15  Your Name
#  8  Team Member

해보기: 실전 필터링 조합

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 최근 1주일간 내 작업
git log --author="Your Name" --since="1 week ago" --oneline

# 2. README 변경 이력
git log --oneline -- README.md

# 3. 버그 수정 커밋만
git log --grep="fix" --no-merges --oneline

# 4. 특정 기간의 특정 파일
git log --since="2025-02-01" --until="2025-02-05" -- src/auth.js

# 5. 릴리스 노트 생성
git log v1.0..HEAD --no-merges --format="- %s"

# 6. 코드 리뷰용
git log --author="Team Member" --since="yesterday" -p

결과: 필요한 커밋만 정확하게 찾을 수 있습니다


정리

완료 체크:

  • log 기본 사용법과 출력 구조를 안다
  • 다양한 포맷 옵션으로 정보를 시각화할 수 있다
  • 필터링으로 원하는 커밋만 찾을 수 있다

핵심 명령어:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 기본
git log                       # 전체 히스토리
git log --oneline             # 간결한 출력
git log -5                    # 최근 5개
git log --stat                # 파일 통계
git log -p                    # diff 포함

# 포맷
git log --graph               # 브랜치 그래프
git log --all                 # 모든 브랜치
git log --decorate            # 브랜치/태그 표시
git log --format="%h - %s"    # 커스텀 포맷
git log --date=short          # 날짜 형식

# 필터링
git log --since="1 week ago"  # 시간
git log --author="Name"       # 작성자
git log --grep="fix"          # 메시지
git log -- file.js            # 파일
git log -S "code"             # 코드 변경
git log main..feature         # 브랜치 범위
git log --merges              # 병합 커밋만
git log --no-merges           # 병합 제외

유용한 Alias:

1
2
3
4
5
6
7
# 설정
git config --global alias.lg "log --oneline --graph --all --decorate"
git config --global alias.ll "log --format='%C(yellow)%h%C(reset) - %s %C(green)(%cr)%C(reset) %C(blue)<%an>%C(reset)'"

# 사용
git lg                        # 그래프 뷰
git ll -10                    # 예쁜 로그

실전 활용:

1
2
3
4
5
1. 일일 작업 확인: git log --since="yesterday" --author="나"
2. 릴리스 노트: git log v1.0..v2.0 --no-merges
3. 코드 리뷰: git log --author="팀원" -p -3
4. 버그 추적: git log -S "버그코드" -p
5. 파일 히스토리: git log -- 파일명

다음: Day 38 - git diff 변경사항 확인


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.