ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Git commit 삭제 후 복구 경험담
    Linux 2021. 4. 16. 23:05
    반응형

    1. 서론

    Linux 명령어로 git을 다룰 수 있다는 것을 알게 된 후 이것저것 눌러봤습니다.

    덕분에 커밋, 파일을 통째로 삭제 해서 눈물을 흘리다가 복구하는 법도 배우게 됐습니다.

     

    2. 파일은 그대로, 커밋은 삭제

    git reset --soft HEAD~~~ 

    이전 3개의 커밋을 삭제하는 명령어 입니다. 물결 표시를 1개만 하면, 1개만 삭제됩니다.

    git reset --soft ORIG_HEAD 

    삭제한 커밋을 복구하는 명령어입니다.

     

    3. 파일, 커밋 모두 삭제

    주의해야 합니다. 제가 방금 날려보고, 쓰는 글입니다.

     

    git reset --hard HEAD~~~ 
    
    /*
     * 명시적으로 숫자를 입력해주는 방법
     */
    git reset --hard HEAD~1
    git reset --hard HEAD~2

    '~' 표시가 삭제할 이전의 커밋 개수입니다. 아래의 2개와 같이 명시적으로 숫자를 입력할 수도 있습니다.

     

    git reset --hard ORIG_HEAD 

    물론 복구 명령어도 있습니다. 이전의 커밋으로 돌아가는 겁니다. 즉 삭제 전 커밋으로 돌아가게 됩니다.

     

     

    보통 의도치 않게 명령어 입력으로 삭제하게 되면, 당황해서 이것저것 눌러보다 돌이킬 수 없는 강을 건너는 경우가 있습니다.

     

    하지만 침착하시고, 아래의 명령어를 보시면 됩니다.

     

    4. SHA-I 값 찾기 및 복구

    git reflog

    git 은 커밋을 할 때마다 계속해서 기록을 남깁니다. 이때 이 기록을 볼 수 있는 게 reflog입니다.

     

     


    그렇다면 log와는 어떤 차이가 있을까요?

    log는 현재 상태의 깃의 history만을 보여줍니다. 예를 들어 'git commit --ammend"로 커밋을 합친 후 'git log'를 하면, 이전의 커밋은 보이지 않고 합쳐진 커밋만 보입니다. 앞에서 설명한 대로 '현재 상태'의 history만 보여줍니다.

     

    하지만 reflog는 '--ammend' 후에도 이전의 커밋을 모두 볼 수 있습니다. git이 뒤에서 조용히 모든 history를 기록하기 때문인데요. 그렇기 때문에 삭제한 커밋의 SHA-1 값도 찾을 수 있습니다.

     

    이러한 이유에서 삭제됐을 때 당황하지 않고, 'reflog'만 기억하면 삭제 이전의 SHA-1 값을 가진 커밋을 볼 수 있습니다.

     

    자, 이제 복구해봅시다.


     

    'git reflog'로 SHA-I 값을 가지고 왔다면, 아래의 명령어를 실행합니다.

    git cherry-pick [SHA-I 값]

     

    'git cherry-pick' 명령어는 다른 브랜치의 커밋을 가지고 옵니다. merge와는 다르게 해당 커밋만을 가지고 올 수 있습니다.

     

    그리고 해당 커밋 시점으로 복구가 됩니다. 간단하죠?

     

     

    반응형

    댓글

Designed by Tistory.