잃어버린 내 코드 찾기(feat. github)

dongEon·2025년 9월 17일
0

목차

  1. 사건의 발단
  2. 문제 해결 과정과 학습 계기
  3. 주요 개념
  4. 세 가지 개념 비교
  5. [간단한 그림으로 전체 요약](#간단한 그림으로 전체 요약)
  6. 결론

사건의 발단

회사에서 리팩토링을 진행하면서 수많은 커밋과 수차례의 merge가 진행되었었다.
리팩토링의 종점에 거의 도달했을때, 리팩토링 초창기에 있었던 코드가 필요하다는 것을 알게 되었다.
해당 코드의 line 의 위치는 기억하지만 이미 최신 브랜치에서는 해당라인이 다른 코드로 덮여 있는 이 상황...

문제 해결 과정과 학습 계기

옆자리 사수분 (shout out to calvin ) 께 내 상황을 공유하고 도움을 요청하니 Github permalink와 git blame 을 통해 타임머신으로 이동해서 쉽게 찾으셨습니다.
그때 들은 설명과 해당 키워드를 통해 내가 개인적으로 공부한 내용을 기록하려고 합니다.

주요 개념

  • GitHub Permalink
  • Git Blame
  • Git log
  1. 개념
    Permalink 는 브랜치명 대신 특정 커밋 해시를 URL에 넣어, 그 커밋 시점의 파일(그리고 선택한 라인 범위)을 가리킨다. 브랜치가 앞으로 업데이트되더라도 Permalink는 과거 시점에 “고정”된다.
  • 브랜치 링크(시간에 따라 변함)
    https://github.com/org/repo/blob/main/src/utils/date.ts#L10-L20
  • Permalink(커밋 고정, 내용 불변)
    https://github.com/org/repo/blob/3c7e92b5a5/src/utils/date.ts#L10-L20
    여기서 3c7e92b5a5는 커밋 해시이며, #L10-L20은 라인 앵커다. 이 링크는 그 커밋의 트리 스냅샷 안에서 해당 경로와 라인을 표시한다.
  1. 생성 방법
  • GitHub 웹에서 파일을 열고 줄 번호를 클릭 → “Copy permalink” 또는 상단 메뉴의 “…” → Copy permalink” 를 사용한다.
  • 이미 브랜치 링크를 보고 있다면, 키보드 단축키 Y 를 누르면 URL이 자동으로 커밋 해시 기반의 Permalink로 변환된다.
  • 라인 범위는 #L10 또는 #L10-L20 형태로 지정한다.
  1. 간단한 도식
main:     A ---- B ---- C (HEAD)
              \
Permalink →    B  ← 고정된 스냅샷

Git Blame

  1. 개념
    Blame은 파일의 각 라인이 현재 모습으로 자리 잡게 된 가장 최신 커밋을 표시한다.
    GitHub 파일 화면의 Blame 버튼으로 접근할 수 있고, CLI에서는 git blame을 쓴다.
  • 본질: “이 줄은 누가 언제 어떤 커밋에서 마지막으로 손댔는가?”
  • GitHub Blame에는 “View blame prior to this change” 기능이 있다. 이는 해당 줄을 바꾼 그 커밋의 직전 상태로 점프하여 라인의 족보를 거슬러 올라가게 한다.
  1. “prior to”가 이동하는 기준
  • git log 처럼 파일의 최신 커밋 순서로 이동하는 것이 아니라, 그 줄을 실제로 수정한 커밋 체인만 따라간다.
  • 즉, 줄을 수정하지 않은 커밋은 건너뛰고, e -> c -> a 와 같이 라인을 바꾼 커밋들만 역순으로 밟는다.

도식

커밋 전체:  a ---- b ---- c ---- d ---- e (HEAD)
라인 수정:  *           *           *

blame prior-to 체인:  e  →  c  →  a
log(파일) 체인:        e  →  d  →  c  →  b  →  a

Git Log와 GitHub History

  1. 개념
    Log, History는 파일단위의 모든 커밋을 시간 역순으로 나열한다. github 파일 화면의 history 버튼이 이에 해당된다.
  • 핵심: "이 파일은 어떤 커밋들을 거쳐 바뀌어 왔는가?"
  • 라인을 건드리지 않은 변경(ex 파일 헤더 주석, import 정리, 포맷팅 등)도 모두 표에 잡힌다.

세 가지 개념 비교

구분PermalinkBlameLog/History
기준특정 커밋 + 파일 + 라인(범위)특정 라인의 마지막 수정 커밋(라인 계보)파일 전체 커밋 이력
보여주는 것고정 스냅샷(재현가능)라인의 최신 수정자와 커밋, prior-to로 과거 추적파일에 영향을 준 모든 커밋(라인 비특이적)
이동/탐색고정(변하지 않음)라인을 수정한 커밋 체인만 역추적시간 역순으로 커밋 나열
장점문서화/리뷰에 안정적 인용“그 줄”의 역사와 맥락을 정확히 추적큰 흐름, 중요한 전환점 파악
한계최신과 동기화되지 않음rename/이동 감지에 제약(웹)라인 기원 파악에는 부정확
GitHub 위치Code 뷰 → Copy permalink 또는 YCode 뷰 → Blame → prior toCode 뷰 → 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: 분기/병합의 노선도 파악

결론

  • Permalink 는 스냅샷의 정밀한 인용 도구다. 브랜치가 움직여도 링크는 움직이지 않는다.
  • Blame 은 라인 단위의 족보다. prior -to 체인으로 "그 줄"의 진화를 거슬러 올라간다.
  • Log, History는 파일의 연대기이다. 큰 변곡점과 흐름을 파악하는데 유리하다.

왜 dev 브랜치가서 코드 확인 안했냐는 나쁜 말은 ㄴㄴ

profile
개발 중에 마주한 문제와 해결 과정, 새롭게 배운 지식, 그리고 알고리즘 문제 해결에 대한 다양한 인사이트를 공유하는 기술 블로그입니다

0개의 댓글