이 명령어는 작년에 Dani님을 통해서 였지만 실제로 써본 것은 근래의 일입니다. 이제는 Git을 공부하기에 Pro Git이라는 좋은 책도 있기 때문에 포스팅을 할 예정이 없었다가 Toby님의 압박을 받고 나처럼 git stash의 존재를 몰랐던 사람도 있을 꺼라는 생각에 포스팅합니다.
git stash는 공식사이트의 레퍼런스 문서에 잘 나와있습니다. 내용은 원래도 잘 되어 있었겠지만 Git 공식사이트가 리뉴얼을 한 뒤에는 깔끔해져서 보기가 좋더군요. 그동안은 항상 검색하거나 Github의 Help 페이지를 참고했었는데 앞으로는 공식 레퍼런스문서를 봐야겠습니다. 간단히 말하자면 git stash는 워킹 디렉토리에 unstaged 파일들을 백업하고 워킹디렉토리를 깨끗한 상태 즉 HEAD의 상태로 만드는 것입니다.
위와 같은 상황을 보겠습니다. git 저장소에 아직 커밋을 하지 않은 변경사항이 있습니다.(test 파일) 이렇게 변경사항이 있는 경우 rebase를 시도하면 이 커밋하지 않은 내역때문에 실패를 하게 됩니다. 원격저장소에서 pull을 하는 경우에 변경사항이 충돌이 나게 되면 마찬가지로 실패를 합니다. 소스 수정을 지속적으로 이뤄지기 때문에 소스를 한창 수정하다가 다른 일이 생각나서 다른 작업을 하려는데 이 수정사항때문에 하지 못하는 경우가 있습니다. 이런 경우 소스가 완성되지 않았지만 그냥 커밋을 하거나(제일 안좋은 방법이라 생각합니다.) 브랜치를 생성해서 브랜치에 임시로 커밋한 다음에 다시 돌아와서 작업을 하고 브랜치에 커밋한 내용을 가지고 추후에 다시 작업하는 방법도 있습니다. 아니면 원시적으로 폴더를 복사해서 백업했다가 나중에 일일이 다 적용하는 방법도 있습니다.
git stash는 이러한 경우에 유용한 명령어입니다. unstaged 상태인 변경사항을 일시적으로 백업하고 워킹디렉토리를 깨끗한 상태로 유지합니다.
위와 같이 unstaged 변경사항이 있는 경우 git stash 명령어를 실행하면 현재의 변경사항이 저장되고 워킹디렉토리는 HEAD 상태로 돌아가게 됩니다.(여기서 untracked 내역들은 stash로 백업되지 않습니다.) git stash는 사실 git stash save와 같은 명령어입니다. 이제 워킹디렉토리가 깨끗해졌으므로 원래 하려던 rebase나 pull같은 작업을 정상적으로 할 수 있습니다.
git stash로 저장한 내역은 git stash list로 조회해 볼 수 있고 git stash show stash이름을 사용하면 특정 stash의 자세한 내용을 볼 수 있습니다. 워킹 디렉토리에 stash를 다시 적용하려면 git stash pop을 사용합니다. 이 명령어는 stash에 저장한 내용을 워킹디렉토리에 적용하고 stash 내역에서 이를 제거합니다. 제거하지 않고 적용만 하려면 git stash apply를 사용합니다. git stash에 대한 더 자세한 사용법과 옵션은 레퍼런스 문서를 참고하면 됩니다.
Git stash drop도 있네용
앗... 레퍼런스 문서 보면서 적고 있었는데 drop을 빠뜨렸군요... ㅡㅡ;;