포스트

[GitHub 100일 챌린지] Day 69 - Git Reflog로 복구하기

[GitHub 100일 챌린지] Day 69 - Git Reflog로 복구하기

100일 챌린지 Day 69 - Reflog는 삭제된 커밋도 복구할 수 있는 Git의 안전망입니다.

배울 내용

  1. Reflog의 역할
  2. 삭제된 커밋 복구
  3. Reflog 활용

1. Reflog란?

reflog는 로컬 저장소에서 HEAD와 브랜치가 어디를 가리켰는지 기록하는 안전망입니다. git log는 현재 브랜치에서 도달 가능한 커밋만 보여주지만, git reflog는 reset, rebase, checkout, commit 같은 이동 기록을 보여줍니다.

1
2
3
4
git reflog

# abc1234 HEAD@{0}: commit: New feature
# def5678 HEAD@{1}: reset: moving to HEAD~1

실수로 커밋이 사라진 것처럼 보여도, reflog에 커밋 해시가 남아 있다면 복구할 수 있습니다.

주의: reflog는 로컬 기록입니다. 다른 사람의 컴퓨터나 원격 저장소에서 자동으로 공유되지 않습니다.


2. Reset 복구

1
2
3
4
5
6
7
8
# 실수로 Reset
git reset --hard HEAD~3

# Reflog 확인
git reflog

# 복구
git reset --hard abc1234

reset --hard는 작업 디렉터리 변경까지 지우는 강한 명령입니다. 복구 전에 현재 변경이 필요하다면 먼저 브랜치나 stash로 보관하세요.

더 안전하게 복구하려면 새 브랜치를 만드는 방법도 있습니다.

1
git switch -c recover-before-reset abc1234

이렇게 하면 현재 브랜치를 바로 움직이지 않고, 복구 지점에서 새 브랜치를 만들어 내용을 확인할 수 있습니다.


3. 브랜치 삭제 복구

1
2
3
4
5
6
7
8
# 브랜치 삭제
git branch -D feature

# Reflog에서 찾기
git reflog

# 복구
git switch -c feature def5678

브랜치를 삭제해도 커밋 자체가 바로 사라지는 것은 아닙니다. 해당 커밋을 가리키는 이름이 사라졌을 뿐입니다. reflog에서 마지막 작업 지점을 찾으면 다시 브랜치를 만들 수 있습니다.


4. Rebase 실수 복구

rebase 중 커밋 순서가 꼬였거나 잘못 squash했다면 이전 HEAD 위치를 찾습니다.

1
2
3
4
5
6
7
git reflog
# 123abcd HEAD@{0}: rebase (finish): returning to refs/heads/feature
# 789efgh HEAD@{1}: rebase (start): checkout main
# 456wxyz HEAD@{2}: commit: Add search filter

# rebase 전 상태로 새 브랜치 생성
git switch -c recover-before-rebase 456wxyz

바로 reset --hard로 되돌리기보다 새 브랜치에서 확인하면 실수 위험이 줄어듭니다.


5. 실전 복구 순서

당황했을 때는 아래 순서를 따르세요.

1
2
3
4
git status
git reflog
git show 복구할커밋해시
git switch -c recover-work 복구할커밋해시

복구 브랜치에서 파일을 확인한 뒤 필요한 변경만 원래 브랜치로 가져옵니다.

1
2
git switch main
git cherry-pick 복구할커밋해시

또는 특정 파일만 가져올 수도 있습니다.

1
git restore --source=recover-work -- src/app.js

정리

완료 체크:

  • Reflog로 삭제된 커밋을 복구할 수 있다
  • Reset을 되돌릴 수 있다
  • 삭제한 브랜치를 새 브랜치로 복구할 수 있다
  • rebase 실수 후 안전하게 복구 브랜치를 만들 수 있다

핵심 요약:

  • git reflog - 모든 HEAD 기록
  • git switch -c recover 해시 - 안전한 복구 브랜치 생성
  • git reset --hard 해시 - 현재 브랜치를 특정 시점으로 강제 이동
  • reflog는 로컬 안전망이므로 원격 공유 기록이 아니다

다음: Day 70 - Git Bisect


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.