第5講

변경 이력 보기

4 閲覧 1

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 그래프

채용정보
공지사항
인사이트
MY