스테이시(stash)에 안전하게 보관하기

어떤 브랜치에서 파일을 수정하거나 추가한 후 커밋하지 않은 상태에서 다른 브랜치로 체크아웃할 경우 아래와 같이 오류메시지를 보게 된다.

$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        00_topsection/css/meritz.css
Please commit your changes or stash them before you switch branches.
Aborting

커밋을 하고 체크아웃하면 되겠지만 작업 도중이고 아직 완료가 되지 않은 상태에서 갑작스런 핫픽스 요청이 들어왔을 때 안전하게 저장하기 위해서 stash를 사용할 수 있다. 현재 진행중이던 내용들을 언제든지 git stash로 저장해두고 다른 브랜치로 이동하여 작업한 뒤에 다시 돌아와 복구하여 작업을 계속할 수 있다. 또 저장한 내용을 다른 브랜치로 옮기는 것도 충분히 가능하다. (아마 잘못된 브랜치에서 작업중이었음을 뒤늦게 알았을 경우) 안전하게 보관한 뒤 복구하기

$ git status
On branch feature-meritz
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   css/meritz.css

위와 같이 아직 작업중인 meritz.css 파일이 있다고 하자. 아직 인덱스에 추가하지도 커밋하지도 않은 상태에서 다른 브랜치로 체크아웃을 해야 한다면 다음과 같이 안전하게 저장해 두자

git stash : 스테이시로 안전하게 보관

$ git stash
Saved working directory and index state WIP on feature-meritz: 629732d update css
HEAD is now at 629732d update css

작업 디렉토리와 인덱스 상태가 저장되었다고 나온다. 그리고 HEAD는 작업 커밋 상에 있음을 알려준다. git status 명령을 실행하면 meritz.css의 변경사항이 없어진 걸 알 수 있다. 이제 다른 브랜치로 체크아웃 할 수 있다.+

git stash list : 스테이시 목록 조회

$ git stash list
stash@{0}: WIP on feature-meritz: 629732d update css

git stash 하위 명령으로 list를 실행하게 되면 현재 stash area에 저장되어 있는 변경사항들을 모두 조회 가능하다. 목록 앞에 보이는 stash@{0}는 stash ID로 각각의 저장 내용을 구별짓는 번호이다. stash는 스택 방식으로 동작한다. 가장 최근에 저장한 것이 가장 먼저 나오게 된다.

git stash pop : 저장내용을 복구

$ git stash pop
On branch feature-meritz
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   css/meritz.css

git stash pop 명령을 통해 저장내용을 현재 브랜치에 적용할 수 있는데 이때 git status 결과를 함께 보여준다. 그리고, 스테이스 목록에서도 제거된다.

git stash apply : stash에 저장된 내용을 다른 브랜치에 적용

$ git stash apply
On branch hotfix
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   css/meritz.css

git stash apply 명령은 git stash pop와 비슷하면서도 다르다. 일단 현재 브랜치에서 저장된 내용을 적용하는 것은 동일하다. 하지만 적용된 저장된 내용을 stash 목록에서 drop하지는 않는다. 그러므로 이를 이용하면 여러 브랜치에 저장된 내용을 적용하는 것이 가능하다.

git stash drop : stash에 저장된 내용 삭제

$ git stash drop stash@{0}
Dropped stash@{0} (629732d629732d629732d629732d)

git stash drop 명령은 특정 stash를 삭제해 준다. stash ID를 명시하지 않으면 pop과 같이 나중에 저장된 내용이 먼저 삭제된다.


Reference

git 생활코딩