본문 바로가기
Git

Git(38) 삭제한 stash 복구 하기

by 새발개발JA 2022. 7. 19.
반응형

 

 

 

 

git stash 는 다들 많이 알 것이다. 어느날 stash 를 하다가 실수로 drop 해버렸다. 

이럴때 drop 해버린 stash 에 담긴 파일들을 복구해보자.

 

 


Git(38) 삭제한 stash 복구 하기

 

1. 아래 명령어를 치면 내가 삭제한 commit 들이 나온다

$ git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk

 

하나하나씩 살펴보자면,

$ git fsck            // file system check 의 약자이다. database 의 connectivity 와 validity 를검사한다.

 

$ --unreachable // Print out objects that exist but that aren’t reachable from any of the reference nodes.

 

$ grep commit   // git fsck 할때 commit 된 파일들만 조회한다는 뜻이다

 

$ cut -d '  ' -f 3    // 파일에서 띄어쓰기를 기준으로 3번째 필드만 보여주겠다는 뜻이다.

 

$ xargs git log --merges --no-walk      // 즉, 위에서 받은 커밋에 대한 git 로그를 보여준다.

--merges 옵션은 Print only merge commits 이고,

--no-walk 는 Only show the given commits, but do not traverse their ancestors 라는 뜻이다.

 

즉, 해석해보면 이런 뜻이다.
"깃 파일들을 검사할 때, 도달할수없는(삭제한) 파일들을 찾고, 그중에 커밋만 추려내서, 깃 로그로 보여줘라"
(cut 옵션으로 추려서 보여주고) 

 

 

 

2. 해당하는 커밋해쉬를 찾아서 stash 에 test 라는 이름으로 넣어주자

$ git update-ref refs/stash f3286a58b3f9f82c3f10bad018f253348bf81b7f -m test

 

하나하나씩 살펴보자면,

$ git update-ref      //  Update the object name stored in a ref safely

 

$ refs/stash            // Git stash stores to the working directory locally ( .git/refs/stash ) 저장될 파일디렉토리 명시

 

$ f3286a... -m test  // 커밋해쉬# 넣어주고 test 라고 이름을 적어주었다.

 

즉, 해석해보면 이런 뜻이다.
" f3286a... 로 시작하는 얘를 다시 살려서 test 라는 이름으로 refs/stash 파일안에 ref 를 업데이트해줘"

 

 

3. 다시 잘 복구 되었는지 확인해보자

$ git stash list

아주 잘 복구 되었다.

 

 

 

 

 

 

반응형

댓글