-
[Git] 실수로 날라간 stash 복구하는 법👩🏻💻 정리/Git 2022. 12. 11. 01:37
7일 TIL에도 살짝 언급된 사연인데.. 때는 바야흐로 지난 화요일 새벽.. stash해놨던 untracked file이 날라간 사건이 발생했다. Git을 사용한지 그래도 거의 2년 가까이 되면서 이제 웬만큼 익숙해져 당황할 일이 많이 없었을 뿐더러 이렇게 파일이 날라간 일은 처음이기 때문에 당황스러웠다. 근데 다른 한편으로는 그래도 내 로컬에는 어떠한 히스토리라도 남아있지 않을까? 하는 생각이 들었고, 어떻게든 한번 복구시켜보리라는 마음으로 복구를 시도해보았다. 결과는 성공! 그렇다면 어떻게 성공했는지 기록으로 남겨보자.
우선 stash한 파일이 왜 날라갔는지부터 원인을 파악해보면..... 브랜치를 따서 작업하면서 작업을 완료하고 해당 브랜치에 push한다는 게 모르고 origin main으로 push하게 되었고, 이 부분을 수정하고 싶어 rebase를 하게 되었다. push한 후의 해당 브랜치에는 아직 미완성이라 커밋되지 않은 새로운 파일들이 존재한 상태였고, rebase를 위해서 우선 stash를 하고, main으로 브랜치를 전환했다.
그런 뒤 원하는 대로 rebase와 force-push를 통해 main 브랜치의 히스토리를 수정하였고(참고로 혼자서 사용하는 레포지토리니까 force-push한 것이고.. 협업하는 레포지토리에서는 절대 사용 안함!), 이제 다시 작업하던 브랜치로 돌아와 git stash pop을 요청하였으나 pop할 stash 파일이 존재하지 않는다는 것이다;;
곰곰이 생각해보니 main에 히스토리를 hard 옵션으로 모두 지우는 방식으로 수정하게 되면서 해당 브랜치에서도 HEAD가 stash하기 전 시점으로 돌아가게 되었고, stash 해놓은 파일들도 시점 상으로는 존재하지 않게 되기 때문에 사라져버리는 것인가? 하는 생각이 들었다..! (무튼 앞으로는 hard 옵션은 사용하지 말자!)
그래서 복구할 수 있는 방법이 있는지 엄청 찾아보았고, 나와 같은 경우가 꽤 있었는지 꽤 많은 블로그 글을 확인할 수 있었다.
그래서 내가 해결한 방법은
1. 아래 커맨드로 stash commit들의 hash 값을 가져온다.
git fsck --no-reflog | awk '/dangling commit/ {print $3}' | xargs -L 1 git --no-pager show -s --format="%ci %H" | sort
그랬더니 나오는 hash 값은 아래와 같이 총 4개였는데, 12시 43분, 48분 두 개로 판단되었다. 그래서 우선 43분 hash 값을 복사하였다!
2. 그 후 아래 커맨드로 stash를 복구한다.
git stash apply {방금 복사한 stash의 hash 값}
43분 커밋 주소가 내가 원했던 파일들을 복구해줘서 48분 hash 값까지는 확인하지 않아도 되었지만, 만약 이게 아니었다면 48분을 확인해봐야 했을 수도 있었다!
참고
'👩🏻💻 정리 > Git' 카테고리의 다른 글
[Git] git pull 되돌리는 방법 (reflog) (0) 2024.09.12 [Git] 특정 브랜치 커밋 가져와 하나로 합치고 이름 바꾸는 방법! (cherry-pick & rebase) (1) 2022.10.04 [Git] fatal: Could not read from remote repository 오류 해결 방법 (0) 2022.09.19 Git & Github (0) 2022.08.07