git log -S/-G: 피카악스로 코드 변경 추적

git log의 피카악스(-S, -G) 옵션으로 특정 코드 문자열이 언제 추가·삭제·수정됐는지 전체 히스토리에서 추적하는 법. -S와 -G의 차이, --pickaxe-regex, 함수 단위 추적까지 정리한다.

· 6 min read · PALDYN Team

지난 글에서 git bisect run으로 버그를 도입한 커밋을 자동으로 찾는 법을 다뤘다. 그런데 때로는 “이 함수가 언제 생겼지?”, “이 설정값을 누가 지웠지?”처럼 특정 코드 조각의 일대기가 궁금할 때가 있다. 커밋 메시지를 검색해도 안 나오고, git log로 파일 전체 히스토리를 훑기엔 변경이 너무 많다. 이럴 때 쓰는 도구가 피카악스(pickaxe)git log -S-G 옵션이다. 광부가 곡괭이로 광맥을 캐듯, 방대한 히스토리에서 특정 문자열이 드나든 커밋만 골라낸다.

핵심은 커밋 메시지가 아니라 diff 내용을 검색한다는 점이다. 코드가 변경된 실제 순간을 짚어주므로, 메시지가 부실해도 변경 시점을 정확히 찾을 수 있다.

피카악스는 문자열이 등장/소멸한 커밋을 찾는다

-S: 등장 횟수가 바뀐 커밋

-S는 지정한 문자열의 등장 횟수가 이전 커밋과 달라진 커밋만 골라낸다. 즉 그 문자열이 추가되거나 삭제된 시점을 짚는다.

# "MAX_RETRY" 라는 식별자가 추가/삭제된 커밋만
git log -S "MAX_RETRY"

# 각 커밋의 실제 diff까지 함께 보기
git log -S "MAX_RETRY" -p

# 특정 파일로 범위 좁히기
git log -S "MAX_RETRY" -- src/config.js

위 그림에서 문자열 등장 개수가 0→2로 늘어난 커밋(추가)과 2→0으로 줄어든 커밋(삭제)만 결과에 나온다. 단순히 줄을 옮기기만 해서 총 개수가 그대로인 커밋은 잡히지 않는다 — 이것이 -S의 특징이자 한계다.

-G: 변경 줄에 패턴이 나타난 커밋

반면 -G는 추가(+)나 삭제()된 줄 중 어느 하나라도 패턴(정규식)에 매칭되면 그 커밋을 잡는다. 등장 횟수가 변하지 않는 수정이나 이동까지 포착한다.

-S와 -G의 차이

# 변경된 줄 어딘가에 "fetchUser(" 가 등장한 커밋 모두
git log -G "fetchUser\("

# 정규식으로 함수 호출 패턴 추적
git log -G "console\.(log|error)"

차이를 정리하면, “이 값이 언제 생겼고 언제 사라졌나”가 궁금하면 -S, “이 코드를 언제 건드렸나”(수정·이동 포함)가 궁금하면 -G를 쓴다. 기본적으로 -S는 문자열을 그대로(literal) 찾지만, --pickaxe-regex를 붙이면 정규식으로 해석한다.

git log -S "user_[0-9]+" --pickaxe-regex

함수 단위로 좁히기: -L

특정 함수의 변경 이력만 따라가고 싶다면 -L 옵션이 강력하다. 파일 안의 함수 이름이나 줄 범위를 지정하면, 그 영역에 가해진 변경만 시간순으로 보여준다.

# 함수 정규식으로 지정: login 함수의 변천사
git log -L ":login:src/auth.js"

# 줄 범위로 지정: 10~25번째 줄의 이력
git log -L 10,25:src/auth.js

실무 활용

피카악스는 디버깅과 코드 고고학에 두루 쓰인다. 예를 들어 설정값이 사라져 장애가 났을 때 누가 언제 지웠는지 즉시 추적할 수 있다.

# 사라진 설정 키가 마지막으로 존재하던 커밋 찾기
git log -S "ENABLE_CACHE" -p -- config/

# 결과의 첫 커밋이 곧 변경(삭제) 시점

또한 보안 점검에서 과거에 하드코딩된 비밀번호나 토큰이 커밋된 적이 있는지 훑을 때도 유용하다. -S로 의심 문자열을 검색하면 히스토리 어디에 노출됐는지 한눈에 드러난다 — 노출이 확인되면 즉시 키를 폐기하고 히스토리에서 제거해야 한다.

피카악스가 diff 내용을 검색했다면, 다음 글에서는 커밋 메시지 자체를 검색하는 git log --grep을 다룬다. 두 도구를 함께 쓰면 “무엇이 바뀌었나”와 “왜 바뀌었나”를 모두 빠르게 찾을 수 있다.


지난 글: git bisect run: 테스트로 버그 커밋 자동 추적

다음 글: git log —grep: 커밋 메시지로 검색하기


읽어주셔서 감사합니다. 😊