Linux

Git commit 삭제 후 복구 경험담

페페로니피자 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와는 다르게 해당 커밋만을 가지고 올 수 있습니다.

 

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

 

 

반응형