삭제된 코드 한 줄이 언제 사라졌는지 git log -S로 찾기
문제 발생
예전에 있던 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가 정답이었습니다.
해결 방안
- 도입·삭제 시점은
-S로 찾습니다.
git log -S'LEGACY_TIMEOUT' --oneline7c1e4a9 타임아웃 정책을 설정으로 이전
2b93f01 결제 재시도 로직 추가두 커밋만 남습니다. 아래가 도입, 위가 제거입니다.
- 패턴으로 찾으려면
--pickaxe-regex를 붙입니다.-S는 기본이 고정 문자열입니다.
git log -S'LEGACY_[A-Z_]+' --pickaxe-regex --oneline- 건드린 모든 커밋을 보려면
-G입니다.
git log -G'LEGACY_TIMEOUT' --oneline -p- 특정 줄의 이력만 따라갑니다.
-L은 함수나 구간 단위로 변천사를 보여줍니다. 파일 이름이 바뀌어도 따라갑니다.
git log -L 42,68:src/payment/retry.ts
git log -L :resolveTimeout:src/payment/retry.ts # 함수 이름으로--follow는 파일 하나에만 쓸 수 있습니다. 이름이 바뀐 파일의 이력을 이어 보려면 필요하지만, 공식 문서 기준 경로를 정확히 하나만 지정해야 합니다.
git log --follow --oneline -- src/payment/retry.ts- 범위를 좁히면 훨씬 빠릅니다. pickaxe는 커밋마다 diff를 계산하므로 저장소가 크면 느립니다.
git log -S'LEGACY_TIMEOUT' --since=2024-01-01 -- src/- 커밋을 찾았으면 이유를 봅니다. 삭제 자체보다 그 커밋의 메시지와 함께 바뀐 파일이 답인 경우가 많습니다.
git show 7c1e4a9
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.