회사에서 리팩토링을 진행하면서 수많은 커밋과 수차례의 merge가 진행되었었다.
리팩토링의 종점에 거의 도달했을때, 리팩토링 초창기에 있었던 코드가 필요하다는 것을 알게 되었다.
해당 코드의 line 의 위치는 기억하지만 이미 최신 브랜치에서는 해당라인이 다른 코드로 덮여 있는 이 상황...
옆자리 사수분 (shout out to calvin ) 께 내 상황을 공유하고 도움을 요청하니 Github permalink와 git blame 을 통해 타임머신으로 이동해서 쉽게 찾으셨습니다.
그때 들은 설명과 해당 키워드를 통해 내가 개인적으로 공부한 내용을 기록하려고 합니다.
Permalink 는 브랜치명 대신 특정 커밋 해시를 URL에 넣어, 그 커밋 시점의 파일(그리고 선택한 라인 범위)을 가리킨다. 브랜치가 앞으로 업데이트되더라도 Permalink는 과거 시점에 “고정”된다.https://github.com/org/repo/blob/main/src/utils/date.ts#L10-L20https://github.com/org/repo/blob/3c7e92b5a5/src/utils/date.ts#L10-L20여기서 3c7e92b5a5는 커밋 해시이며, #L10-L20은 라인 앵커다. 이 링크는 그 커밋의 트리 스냅샷 안에서 해당 경로와 라인을 표시한다.main: A ---- B ---- C (HEAD)
\
Permalink → B ← 고정된 스냅샷
도식
커밋 전체: a ---- b ---- c ---- d ---- e (HEAD)
라인 수정: * * *
blame prior-to 체인: e → c → a
log(파일) 체인: e → d → c → b → a
| 구분 | Permalink | Blame | Log/History |
|---|---|---|---|
| 기준 | 특정 커밋 + 파일 + 라인(범위) | 특정 라인의 마지막 수정 커밋(라인 계보) | 파일 전체 커밋 이력 |
| 보여주는 것 | 고정 스냅샷(재현가능) | 라인의 최신 수정자와 커밋, prior-to로 과거 추적 | 파일에 영향을 준 모든 커밋(라인 비특이적) |
| 이동/탐색 | 고정(변하지 않음) | 라인을 수정한 커밋 체인만 역추적 | 시간 역순으로 커밋 나열 |
| 장점 | 문서화/리뷰에 안정적 인용 | “그 줄”의 역사와 맥락을 정확히 추적 | 큰 흐름, 중요한 전환점 파악 |
| 한계 | 최신과 동기화되지 않음 | rename/이동 감지에 제약(웹) | 라인 기원 파악에는 부정확 |
| GitHub 위치 | Code 뷰 → Copy permalink 또는 Y | Code 뷰 → Blame → prior to | Code 뷰 → History, PR, Network |
[브랜치 타임라인]
A ---- B ---- C ---- D ---- E (HEAD)
- Permalink: 특정 시점(B)의 스냅샷을 영구 지칭
- Blame: 특정 라인만 추적 → E → C → A
- Log/History: 파일 단위의 전체 흐름 → E, D, C, B, A
[브랜치/병합 개략]
feature-x ---o
\
A --- B --- C --------M --- E
\ /
hotfix ----o
- History/PR: M에서 어떤 브랜치가 병합되었는지 맥락 확인
- Network: 분기/병합의 노선도 파악
왜 dev 브랜치가서 코드 확인 안했냐는 나쁜 말은 ㄴㄴ