git log의 다양한 옵션으로 커밋 이력을 탐색하는 방법을 배운다. git diff로 변경 내용을 비교하고, git show로 특정 커밋의 상세 내용을 확인한다. 실무에서 자주 쓰는 이력 탐색 패턴을 익힌다.
이력 탐색 — 프로젝트의 기억을 읽는 법
커밋 이력을 읽는 것은 코드를 읽는 것만큼 중요한 기술입니다. "이 코드가 왜 이렇게 작성됐지?", "이 버그는 언제부터 있었지?"와 같은 질문에 답할 수 있습니다.
git log — 커밋 이력 보기
# 기본 — 전체 이력 (최신순)
git log
# 한 줄 요약
git log --oneline
# a3f2c1d feat: 로그인 기능 추가
# b1e9f3a fix: 타입 에러 수정
# c0d8e2b docs: README 업데이트
# 브랜치 구조 시각화
git log --oneline --graph --decorate --all
# 최근 N개만
git log -5
git log --oneline -10
# 특정 파일의 이력만
git log --oneline src/auth.js
# 특정 기간
git log --since="2024-01-01" --until="2024-12-31"
git log --since="2 weeks ago"
# 특정 작성자
git log --author="Kim"
# 커밋 메시지에서 검색
git log --grep="login"
git log --grep="fix" -i # 대소문자 무시
git log — 변경 내용까지 보기
# 각 커밋의 변경 파일 목록
git log --stat
# a3f2c1d feat: 로그인 기능 추가
# src/auth.js | 45 +++++++++++++++++++++
# src/routes.js | 3 +++
# 2 files changed, 48 insertions(+)
# 각 커밋의 실제 diff까지 출력
git log -p
git log --patch
# 특정 파일의 변경 이력 + diff
git log -p src/auth.js
# 코드에서 특정 문자열이 추가/삭제된 커밋 찾기 (pickaxe)
git log -S "getUserById" # 해당 문자열이 변경된 커밋
git log -G "function.*login" # 정규표현식
git diff — 변경 내용 비교
# Working Directory vs Staging Area (아직 add 안 한 변경)
git diff
# Staging Area vs 마지막 커밋 (add는 했지만 commit 안 한 변경)
git diff --staged
git diff --cached # 같은 명령
# Working Directory + Staged 전체 vs 마지막 커밋
git diff HEAD
# 두 커밋 비교
git diff abc123 def456
git diff HEAD~3 HEAD # 3커밋 전 vs 현재
# 특정 파일만 비교
git diff HEAD -- src/auth.js
# 브랜치 간 비교
git diff main develop
git diff main develop -- src/ # 특정 폴더만
# 파일 이름만 (diff 내용 없이)
git diff --name-only HEAD~5 HEAD
git diff --stat HEAD~5 HEAD # 변경 통계
git show — 특정 커밋 상세 확인
# 특정 커밋의 전체 내용
git show abc1234
# 특정 커밋에서 특정 파일만
git show abc1234:src/auth.js # 그 커밋 시점의 파일 내용
git show abc1234 -- src/auth.js # 그 커밋에서의 변경
# HEAD 기준 상대 참조
git show HEAD # 마지막 커밋
git show HEAD~1 # 직전 커밋
git show HEAD~3 # 3커밋 전
# 태그 확인
git show v1.0.0
git blame — 누가 이 줄을 작성했나
# 파일의 각 줄이 어느 커밋에서 작성됐는지
git blame src/auth.js
# 출력:
# abc1234 (Kim 2024-03-15 10:23:41 +0900 1) function login(email, password) {
# def5678 (Lee 2024-04-02 14:11:05 +0900 2) const user = findUser(email);
# abc1234 (Kim 2024-03-15 10:23:41 +0900 3) if (!user) throw new Error("...");
# 특정 줄 범위만
git blame -L 10,25 src/auth.js
# 공백 변경 무시
git blame -w src/auth.js
커밋 참조 방법
절대 참조:
abc1234 # 커밋 해시 (앞 7자만으로도 보통 충분)
abc123456789 # 더 긴 해시
상대 참조:
HEAD # 현재 체크아웃된 커밋
HEAD~1 (HEAD~) # 한 단계 위 부모
HEAD~3 # 세 단계 위 부모
HEAD^ # 직전 커밋 (HEAD~와 대부분 같음)
HEAD^2 # merge 커밋의 두 번째 부모
브랜치/태그:
main # main 브랜치의 최신 커밋
origin/main # 원격 main의 최신 커밋
v1.0.0 # v1.0.0 태그
실무 이력 탐색 시나리오
# "언제 이 기능이 추가됐지?"
git log --oneline --all --grep="소셜 로그인"
# "이 파일이 언제 어떻게 바뀌었지?"
git log --oneline -p -- src/components/LoginForm.jsx
# "특정 함수가 언제 사라졌지?"
git log -S "sendWelcomeEmail" --oneline
# "이 줄은 누가, 왜 이렇게 썼지?"
git blame -L 42,42 src/auth.js
# → 커밋 해시 확인 후
git show abc1234 # 그 커밋의 전체 맥락 확인
# "오늘 내가 뭘 했지?"
git log --oneline --author="$(git config user.name)" --since="1 day ago"
관련 검색어 · git log 옵션, git diff 사용법, git blame, git show 커밋, 커밋 이력 검색, git log 그래프