Git reflog

고급 Git

Amanda Crawford-Adamo

Software and Data Engineer

Git Reflog이란?

  1. 저장소의 모든 참조 업데이트에 대한 로컬 기록
  2. Reflog는 로컬 시스템의 .git/logs/refs/heads/ 디렉터리에 저장됨
  3. 브랜치 팁과 HEAD 위치 변경을 기록
  4. Git 작업의 안전장치 역할
  5. 실수로 인한 변경 또는 삭제 복구에 도움

git 히스토리 변경의 예시 그래프

고급 Git

Git Reflog vs Git Log

기능 Git Reflog Git Log
목적 로컬 저장소의 참조 업데이트/재작성 표시 커밋 기록만 표시
범위 로컬 저장소만 로컬 및 원격 저장소
내용 모든 참조 업데이트(커밋, reset, merge 등) 커밋만
보존 임시(보통 90일) 영구(저장소 역사에 포함)
사용 예 유실 커밋 복구, 최근 작업 파악 프로젝트 역사 보기, 기능 개발 파악
고급 Git

Reflog 명령어

  • 로그 데이터와 HEAD 활동을 표시
    git reflog
    git reflog show
    
  • 오래된 로그나 도달 불가 항목 정리
    git reflog expire
    
고급 Git

Reflog 출력 구조

reflog 출력 텍스트 구조 분해

터미널의 reflog 출력 예시

구성 요소 설명
short-hash 축약된 커밋 해시
ref 보통 HEAD, 때로는 브랜치 이름
index reflog에서의 위치(0이 최신)
action 작업 유형(commit, reset, merge 등)
descriptions 작업에 대한 설명
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
고급 Git

필터링: Since와 Until

  • since = 이 시점부터의 항목 표시

    git reflog --since "time-qualifer"
    
  • until = 이 시점까지의 항목 표시

    git reflog --until "time-qualifer"
    
사용법
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
고급 Git

삭제된 브랜치 복구

시나리오

  • etl-feature라는 브랜치를 생성함
  • 이 브랜치에 ETL 기능 변경 사항을 커밋함
  • 실수로 이 브랜치를 삭제함
  • 코드 변경 사항이 모두 사라짐

etl-feature 브랜치를 어떻게 복구할까요?

해결 방법

  1. git reflog로 삭제된 브랜치의 마지막 커밋 해시 확인
  2. git checkout으로 HEAD를 해당 커밋 해시로 이동
  3. 현재 HEAD에서 새 브랜치 생성
git reflog
git checkout <hash>
git checkout -b <branch-name>
1 https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
고급 Git

Git Reset

  • 특정 커밋 객체로 HEAD를 이동합니다.
  • reset 유형에 따라 작업 디렉터리와 스테이징 영역이 업데이트됩니다.
Reset 유형 명령어 작업 디렉터리 영향 스테이징 영역 영향
Soft git reset --soft <commit> 변경 없음 변경 사항이 스테이징 상태 유지
Mixed (기본) git reset --mixed <commit> 변경 없음 변경 사항이 언스테이징됨
Hard git reset --hard <commit> 변경 사항 폐기 변경 사항 폐기
고급 Git

유실 커밋 찾기

시나리오

  • 커밋과 리베이스 후 테스트가 실패함
  • 어떤 커밋이 원인인지 모름
  • 통과 상태로 되돌려야 함

이전 ETL 스크립트 상태로 어떻게 되돌릴까요?

해결 방법

  1. Git Reflog로 삭제된 커밋 해시 찾기
  2. git reset으로 테스트가 통과했던 커밋으로 되돌리기
git reflog
git reset --soft HEAD@{1}
고급 Git

모범 사례

  • 유실된 코드와 커밋 복구에 강력함
  • 설명적인 커밋 메시지 사용
  • 자주 원격으로 푸시
  • 강제 푸시는 신중히 사용

실수했을 때 Reflog는 로컬 타임머신입니다

시간을 거슬러 가는 시계를 묘사한 이미지

고급 Git

Lass uns üben!

고급 Git

Preparing Video For Download...