본문으로 건너뛰기
개발 머꼬
개발 노트Git
hohyeon.dev13

삭제된 코드 한 줄이 언제 사라졌는지 git log -S로 찾기

  • #Debugging
  • #Engineering Note
  • #Git

문제 발생

예전에 있던 LEGACY_TIMEOUT 상수가 지금은 없습니다. 언제, 왜 사라졌는지 알아야 하는데 git log로는 찾을 수가 없었습니다.

git log --oneline | wc -l   # 4,200 커밋

파일 경로도 확실치 않았습니다. 중간에 파일이 옮겨졌기 때문입니다.

원인 분석

git log는 기본적으로 커밋 메시지를 보여줄 뿐, 변경 내용 안을 찾아주지 않습니다. 커밋 메시지에 "LEGACY_TIMEOUT 제거"라고 적혀 있지 않으면 아무리 훑어도 나오지 않습니다.

공식 문서가 이 용도로 제공하는 것이 pickaxe 옵션입니다. 그리고 자주 헷갈리는 -S-G는 서로 다른 질문에 답합니다.

  • -S<string> — 그 문자열이 몇 번 등장하는지가 달라진 커밋만 찾습니다. 즉 추가되거나 삭제된 시점입니다. 같은 파일 안에서 위치만 옮긴 변경은 개수가 그대로라 잡히지 않습니다.
  • -G<regex> — 그 정규식에 걸리는 줄이 diff에 등장하기만 하면 잡습니다. 위치만 옮긴 변경도 잡힙니다.

찾고 싶은 것이 "도입/삭제 시점"이면 -S, "이 코드를 건드린 모든 커밋"이면 -G입니다. 위 상황은 -S가 정답이었습니다.

해결 방안

  1. 도입·삭제 시점은 -S로 찾습니다.
git log -S'LEGACY_TIMEOUT' --oneline
7c1e4a9 타임아웃 정책을 설정으로 이전
2b93f01 결제 재시도 로직 추가

두 커밋만 남습니다. 아래가 도입, 위가 제거입니다.

  1. 패턴으로 찾으려면 --pickaxe-regex를 붙입니다. -S는 기본이 고정 문자열입니다.
git log -S'LEGACY_[A-Z_]+' --pickaxe-regex --oneline
  1. 건드린 모든 커밋을 보려면 -G입니다.
git log -G'LEGACY_TIMEOUT' --oneline -p
  1. 특정 줄의 이력만 따라갑니다. -L은 함수나 구간 단위로 변천사를 보여줍니다. 파일 이름이 바뀌어도 따라갑니다.
git log -L 42,68:src/payment/retry.ts
git log -L :resolveTimeout:src/payment/retry.ts   # 함수 이름으로
  1. --follow는 파일 하나에만 쓸 수 있습니다. 이름이 바뀐 파일의 이력을 이어 보려면 필요하지만, 공식 문서 기준 경로를 정확히 하나만 지정해야 합니다.
git log --follow --oneline -- src/payment/retry.ts
  1. 범위를 좁히면 훨씬 빠릅니다. pickaxe는 커밋마다 diff를 계산하므로 저장소가 크면 느립니다.
git log -S'LEGACY_TIMEOUT' --since=2024-01-01 -- src/
  1. 커밋을 찾았으면 이유를 봅니다. 삭제 자체보다 그 커밋의 메시지와 함께 바뀐 파일이 답인 경우가 많습니다.
git show 7c1e4a9

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.