Git

HEAD 브랜치, 지워진 커밋 복구하기 | reflog

신림쥐 2023. 12. 19. 09:14
728x90

 

     


     

    개요

    Git을 사용하다 보면 실수로 커밋을 날리거나, 잘못된 브랜치 삭제 등으로 당황할 수 있습니다. 하지만 Git은 의외로 관대합니다. 바로 reflog라는 기능 덕분에 지워진 것처럼 보이는 커밋도 복구할 수 있습니다.
    이번 포스팅에서는 reflog를 활용해 지워진 커밋과 HEAD 브랜치를 복구하는 방법을 알아봅니다.

     

    reflog은 개발자의 구명조끼입니다. 실수했다고 좌절하지 말고, 로그를 믿으세요!

     

    git reflog

    git reflog는 HEAD가 이동한 모든 기록을 추적합니다. 커밋, 리셋, 체크아웃 등 Git의 모든 HEAD 이동 내역이 이 로그에 남아 있습니다.

    이때 reflog 이력은 아래와 같은 상황에서 이전 상태로 되돌아갈 수 있는 단서가 될 수 있습니다.

     

    • git reset --hard로 실수로 커밋을 날렸을 때
    • git commit --amend로 이전 커밋이 덮여버렸을 때

     

     

    커밋 날림시 복구하기

    1. git reflog으로 커밋 해시 확인하기

    git reflog로 되돌리고 싶은 커밋 해시를 확인합니다.

    git reflog
    # 예시 출력
    c4f7f19 HEAD@{0}: reset: moving to HEAD~1
    a12b5ee HEAD@{1}: commit: 로그인 기능 구현
    3e9ac2a HEAD@{2}: commit: 버튼 스타일 수정
    ...

     

     

    리스트를 다 확인했다면, 키보드에서 :q를 입력해 reflog 화면을 종료할 수 있습니다.

    c4f7f19 HEAD@{0}: reset: moving to HEAD~1
    a12b5ee HEAD@{1}: commit: 로그인 기능 구현
    3e9ac2a HEAD@{2}: commit: 버튼 스타일 수정
    ...
    :q

     

     

    2. 커밋 해시 기준으로 checkout

    해당 커밋으로 checkout하거나 새로운 브랜치를 만들어 복구합니다.

    # 특정 커밋 체크아웃
    git checkout a12b5ee
    
    # 혹은 브랜치로 복구
    git checkout -b restore-branch a12b5ee

     

     

    HEAD 브랜치를 삭제시  복구하기

    1. git reflog으로 커밋 해시 확인하기

    git reflog
    # HEAD@{3}: checkout: moving from main to develop ← 이런 로그를 찾습니다.

    2. 커밋 해시 기준으로 checkout

    git reflog로 HEAD가 마지막으로 main을 가리키던 시점을 찾아 그 시점으로 브랜치를 다시 생성합니다.

    git checkout -b main HEAD@{3}

     

     

    이전 상태로 되돌리기

    1. git reflog으로 커밋 해시 확인하기

    git reflog
    # HEAD@{3}: checkout: moving from main to develop ← 이런 로그를 찾습니다.

     

    2. reset 명령어를 사용하여 커밋 상태를 복구

    merge한 내용, 브랜치 삭제된 내용도 해당 시점으로 돌아집니다.

    git reset --head e2all8a
    // git reset --head [commit id]
    
    git reset --head HEAD@{1}
    // git reset --head [HEAD@{id}]

     

     

    728x90