본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

비난 없는 blame

~18 min · blame, history

Level 0추적 전 새싹
0 XP0/47 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

blame은 비난이 아니라 변경 조사야

이름은 손가락질을 떠올리게 하지만 실제 목적은 forensics야. 어느 commit이 이 줄을 넣었는지, 당시 맥락과 message는 무엇인지, 어떤 변경이 함께 들어왔는지를 찾는 도구지. git blame을 잘 쓰면 코드가 왜 지금 모습이 됐는지 빠르게 이해하고 관련 논의까지 찾아갈 수 있어.

git blame file.js는 source의 각 줄마다 짧은 commit hash, author, 날짜, 줄 번호, 내용을 보여줘. 각 줄을 마지막으로 건드린 commit을 가리키는 셈이야. 그 hash를 git show <hash>로 열면 message와 전체 diff, 함께 바뀐 내용이 나타나. blame 한 줄은 입구이고 commit message와 주변 diff가 실제 증거야.

두 flag가 기계적인 잡음을 줄여. git blame -w는 whitespace만 바뀐 변경을 무시하고, git blame -M은 같은 파일 안에서 이동한 코드를 따라가며 -M -M은 파일 사이 이동을 추적해. 이것이 없으면 reformat이나 함수 이동을 한 refactor commit이 넓은 영역을 차지해 원래 의도를 숨길 수 있어. flag를 쓰면 기계적 변경을 지나 실제 logic을 넣은 commit에 가까워져.

git log -L :functionName:file.js도 손에 익혀. 함수 하나를 바꾼 commit과 diff를 시간순으로 보여줘서 함수가 어떻게 진화했는지 알 수 있어. '이 method 동작이 언제 바뀌었지?'나 '왜 이 validation이 여기 있지?'라는 질문에는 git log file.js에서 commit을 하나씩 여는 것보다 훨씬 빨라.

Code

제정신 flag 와 함께 blame 기본·bash
# Default blame (refactor 많은 파일엔 짜증):
git blame src/auth.js

# 유용 — whitespace 무시 + 파일 내 이동 따라감:
git blame -w -M src/auth.js

# 파일 간 이동 + 복사 (느리지만 철저):
git blame -w -C -C src/auth.js

# 40-60 줄만:
git blame -L 40,60 src/auth.js

# 특정 날짜 이전 commit 으로 제한:
git blame --before="2026-04-01" src/auth.js
git log -L 로 함수 history·bash
# src/auth.js 의 authenticateUser() 전체 history 추적:
git log -L :authenticateUser:src/auth.js

# src/auth.js 의 40-60 줄 history 추적:
git log -L 40,60:src/auth.js

# 특정 blame 줄 건드린 가장 최근 commit 열기:
git show $(git blame -L 42,42 src/auth.js | awk '{print $1}')

External links

Exercise

1년 이상 된 활성 프로젝트의 파일 하나를 골라. flag 없이 git blame을 실행한 뒤 -w -M을 붙여 잡음의 차이를 비교해. 한 줄의 hash를 git show로 따라가 commit message가 그 줄을 실제로 설명하는지 적어. 같은 파일의 함수에는 git log -L을 써보고 무엇을 보여줬는지도 기록해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.