본문 바로가기

Development/Git

Git Reflog와 문제 해결: 실수 복구하기

Git은 강력한 버전 관리 도구이지만, 작업 중 실수나 예기치 않은 문제가 발생하면 당황하기 쉽다.
이때 Git Reflog와 함께 다양한 문제 해결 방법을 알고 있다면,
어떤 상황에서도 Git을 유연하게 활용할 수 있다.

이번 글에서는 Git Reflog의 개념과 활용법, 그리고 실수로 인한 다양한 문제를 해결하는 방법을 소개한다.


1. Git Reflog란? 🔍

Git Reflog(Reference Log)는 Git에서 브랜치나 HEAD가 이동한 모든 기록을 추적하는 도구다.

  • 브랜치 이동, 커밋 변경, Reset, Rebase 등 모든 Git 작업의 로그를 볼 수 있다.
  • 실수로 브랜치를 삭제하거나, 이전 상태로 돌아가야 할 때 유용하다.

Reflog의 주요 특징

  1. 모든 작업 이력 추적
    • 커밋, Reset, Merge, Rebase 등 HEAD가 이동한 모든 기록 확인.
  2. 실수 복구
    • 잘못된 Reset, 삭제된 커밋 등으로부터 복구 가능.
  3. 로컬 전용
    • Reflog는 로컬에서만 관리되며, 원격 저장소에는 영향을 미치지 않는다.

Reflog 사용법

1. Reflog 조회

git reflog

출력 예시:

a1b2c3d (HEAD -> main) HEAD@{0}: commit: Fix login bug
d4e5f6g HEAD@{1}: reset: moving to HEAD~1
h7i8j9k HEAD@{2}: commit: Add signup feature

2. 특정 커밋으로 복구

git checkout HEAD@{n}

3. Reset과 함께 사용

git reset --hard HEAD@{n}

[!TIP]
HEAD@{n}에서 n은 Reflog의 순서(가장 최근이 0)다.


2. Git 문제 상황과 해결법 💡

문제 1: 잘못된 커밋을 삭제했을 때

상황

  • Reset 명령으로 커밋을 삭제했는데, 복구가 필요하다.

해결법

  1. Reflog에서 삭제된 커밋 ID 확인:
  2. git reflog
  3. 삭제된 커밋 복구:
  4. git reset --hard <커밋 ID>

문제 2: 브랜치를 실수로 삭제했을 때

상황

  • 중요 브랜치를 삭제했지만, 아직 복구 가능성이 있다.

해결법

  1. Reflog에서 삭제된 브랜치가 가리키던 커밋 ID 확인:
  2. git reflog
  3. 브랜치 복원:
  4. git checkout -b <브랜치 이름> <커밋 ID>

문제 3: 잘못된 Rebase로 커밋이 꼬였을 때

상황

  • Rebase 중 충돌을 잘못 해결하거나 커밋 히스토리가 엉망이 됨.

해결법

  1. Reflog에서 Rebase 이전 상태 확인:
  2. git reflog
  3. Rebase 이전 상태로 Reset:
  4. git reset --hard HEAD@{n}

문제 4: Merge 후 원래 상태로 되돌리고 싶을 때

상황

  • Merge를 잘못 수행했거나, Merge 전 상태로 돌아가야 함.

해결법

  1. Reflog에서 Merge 이전 커밋 ID 확인:
  2. git reflog
  3. Reset으로 되돌리기:
  4. git reset --hard <Merge 이전 커밋 ID>

문제 5: Stash를 잘못 삭제했을 때

상황

  • Stash를 삭제했지만, 다시 복구하고 싶음.

해결법

  1. Stash Reflog 확인:
  2. git reflog stash
  3. 삭제된 Stash 복원:
  4. git stash apply stash@{n}

3. Reflog 활용 꿀팁 🌟

  1. 실험적인 작업 전 스냅샷
    작업 시작 전 커밋해 두거나, 현재 상태를 Reflog로 확인해둔다.
  2. git reflog
  3. Reset을 두려워하지 말자
    Reset으로 히스토리를 잘못 수정했더라도 Reflog를 사용하면 복구 가능하다.
  4. git reset --hard HEAD@{n}
  5. 브랜치 삭제는 걱정 없다
    실수로 삭제된 브랜치도 Reflog에서 커밋 ID를 확인해 복원 가능.
  6. git checkout -b <브랜치 이름> <커밋 ID>

마무리하며 🎉

Reflog를 활용하면 작업 이력을 추적하고 복구할 수 있다.

다음 포스팅에서는 Git Interactive Rebase효율적인 커밋 관리 전략을 다룰 예정이다.
궁금하거나 잘못된 점은 댓글로 남겨 주세요! 🚀