Git Stash

$ git stash는 워킹 디렉토리에 Unstaged - git add 는 수행됨 파일들을 백업하고 워킹디렉토리를 HEAD - 이전 커밋 상태로 만드는 명령이다.

  1. 수정중인 상태를 임시 저장해두고 이전 커밋으로 되돌리기 (커밋을 하거나 브랜치를 만들어서 보관할수 있으나 현재 수정중인 상태라서 따로 커밋 브랜치가 애매한상황)
  2. 현재 브랜치에 작업한 사항을 다른 브랜치로 옮기거나

$ git stash - 현재 수정중인 상태에서 이전 HEAD 의 커밋 상태로 돌아감

$ git stash pop - Stash로 임시 저장했던 상태로 되돌린다. 저장된 스택중에 가장 위에 있는것 최신에 Push 된 상태로 돌아간다.

$ git stash list - 현재 stash(임시 보관)되어진 리스트를 보여줌

$ git stash save NAME - 해당 이름으로 git stash 를 수행 (구별하기 위한 메세지를 지정해주는것 이다.)

$ git stash apply stash@{0} - Stash 이름들은 기본적으로 stash@{0} stash@{1} stash@{2} 이런식으로 지정된다. 해당 이름으로 상태를 돌릴수있다.

$ git stash drop stash@{0} - 저장된 Stash중 해당 이름으로 되어 있는 것을 삭제한다. 생략하면 맨위에 Push 된것을 삭제한다.

$ git stash clear - 모든 Stash 리스트 들을 삭제한다.

Git Stash Merge

Git Stash 가 무조건 임시 보관 상태로 돌리는것이 아니고 해당 파일을 수정후에 Stash 하기 전 상태와 머지를 수행한다. Stash 하기전 상태와 Stash한 후에 파일이 Conflict 가 나는 경우가 있을수 있다.

1 error: Your local changes to the following files would be overwritten by merge:
2   file1
3 Please, commit your changes or stash them before you can merge.
4 Aborting

git stash 를 수행한후에 파일을 수정한다음 git stash pop 으로 돌아가려고 할때 Conflict 이 발생한다면 git commit 을 수행한후에 git stash pop 을 수행한다. 그러면 Conflict 가 발생하고 해당 사항들을 모두 Merge 해주어야 한다.

Git Stash 브랜치 바꾸기

가끔 잘못된 브랜치에 작업을 하고 있을 경우가 있다. 작업한 브랜치에 내용을 내가 원하는 브랜치로 적용하고 싶을때 Git stash 를 사용할 수 있다.

  1. 현재 브랜치에서 작업 된 사항을 모두 git add . 를 수행해 Unstaged 상태로 만들어 준다.
  2. git checkout name 내가 원하는 브랜치로 이동한다.
  3. git stash pop stash로 저장한 상태로 돌려준다.
  4. git commit 해당 브랜치에 커밋해준다.
  5. git checkout master git checkout -- .

추가적으로 master 브랜치의 수정사항을 모두 원상태로 돌려준다. git reset --hard HEAD~1을 수행해 주어도 된다. –hard 옵션을 줄경우 모든 수정 내용이 사라질수 있으니 조심해야 한다.

Reference

JK.Lee