Git Stash 는 무슨 일을 하는지 알아보자. 잠시 상상해보자. 지금 저장소에서 작업하고 있고 master 브랜치에 있다고 하자. 아래의 그림과 같은 상황이다.

그리고 커밋한 후 새 브랜치를 만들고 이동한다.

그리고 puppy 브랜치에서 새로운 작업을 하고, 아직 커밋을 하지 않았다.

즉 위의 dog.py 파일은 만들었지만, 커밋하지 않았다. 그리고 master 브랜치로 다시 넘어가야하는 상황이 생겼다고 하자. 이와 같은 상황에서는 두가지 옵션이 있다. 첫째는 커밋하지 않은 작업들이 내가 master 브랜치로 넘어가면 같이 master 브랜치로 넘어온다. 또 다른 옵션은 깃이 내가 브랜치를 이동하지 못하게 하는 것이다.
따라서 Git Stash라는 것은 어떤 브랜치에서 작업을 하다가 다른 브랜치로 넘어갈 때 임시적으로 저장을 해야될 때 사용하는 것이다.(git stash is super useful command that helps you save changes that you are not yet ready to commit.)
** stash: to store or hide something, especially a large amount.
git stash (save) 는 stash에 임시 저장을 하는 명령어로 save는 생략 가능하다. 아래의 그림과 같이 stash에 working directory에서 하던 작업과 staging area에서의 작업을 임시 보관한다.

git stash pop 은 stash에 가장 최근에 저장된 것을 지우고 현재 작업공간에re-apply 한다. 같은 브랜치나 다른 브랜치에 적용 가능하다.

git stash apply는 stash 영역에 stash를 남겨둔 채로 git stash pop을 한다. 따라서 여러개의 브랜치에 stash 영역의 stash 들을 적용해야할 때 사용할 수 있다.
git stash drop stash@{2} -> 특정 stash 삭제
git stash clear -> 모든 stash 삭제
stash의 스택에 여러 차례 stash를 할 수 있다. 이 때 변경사항들은 스택에 추가하는 순서대로 보관된다. 그러나 대부분은 이렇게 사용할 일이 많이 없고, 99퍼센트 정도는 단순히 git stash 와 git stash pop 정도를 사용한다. stash에 저장된 stashes들을 보는 명령어는 git stash list이다.

이러한 리스트에서 특정 stash를 지정하여 apply하는 명령어는 git stash apply stash@{2} 이다. 이 때 apply하고자 하는 파일이 비어있는 상태여야 apply를 했을 때 stash@{2}를 적용시킬 수 있다.