[Git] git stash: 작업 중인 코드 잠시 꿍쳐두기
git stash
현재 브랜치의 상태를 커밋하지 않고, main 브랜치로 이동하고 싶은 경우가 생겼다!
우선, 직접 중인 사항을 stash*에 잠시 저장한다.
git stash
*stash
Modified이면서 Tracked 상태인 파일과 Staging Area에 있는 파일들을 보관해 두는 장소이다. 아직 끝내지 않은 수정사항을 스택에 잠시 저장했다가 나중에 다시 적용할 수 있다.

필요하다면, 어떤 이유로 stash 하는지 메시지를 남길 수 있다.
git stash -m "스태시 하는 이유 작성"
현재 적용된 commit 이후로 변경된 모든 사항들이 stash 공간으로 이동된다.
이제 main 브랜치로 이동하여 필요한 작업을 진행한다.
git checkout main
필요한 작업이 완료되었으면, 다시 원래 브랜치로 이동해서, 꿍쳐(?)뒀던 코드를 다시 가져온다.
git checkout mybranch
git stash apply
다만, apply 옵션은 단순히 stash를 적용하는 것뿐이기 때문에 여전히 stash는 스택에 남아있다.
git stash drop 명령을 사용하여 해당 stash를 제거해주거나,
git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
git stash drop stash@{0}
또는 git stash pop 명령(apply + drop)을 사용하여 stash를 적용하고 나서 바로 스택에서 제거해 주는 방법도 있다!
git stash pop
그런데 만약 위와 같이 stash 후에 브랜치를 이동해서 작업 후 다시 원래 브랜치로 돌아오는 경우(mybranch -> main -> mybranch)가 아니라 stash 후에 같은 브랜치(mybrach)에서 새로운 작업을 하는 케이스라면, 저장해 뒀던 stash를 적용하는 것이 문제가 될 수 있다.
수정한 파일에 stash를 적용하면 충돌이 일어날 수도 있고, 또 충돌을 해결해야 한다.
이때 사용할 수 있는 것이 git stash branch <브랜치> 명령이다.
이 명령을 실행하면 stash할 당시의 커밋을 chechout한 후, 새로운 브랜치를 만들고 여기에 stash를 적용한다. 이 모든 것이 성공하면 stash를 삭제한다. 즉, 새로운 브랜치를 만들어서 git stash pop 명령(apply + drop)을 수행하는 것이라고 할 수 있다. 충돌이 예측되는 상황 등에 아주 유용할 것 같다.
정리
Git - Stashing과 Cleaning
작업하던 저장소가 완전 지저분해져서 Git에게 진짜로 강제로 정리하도록 해야 하는 경우가 생길 수 있다. 예를 들어 Git 버전관리 데이터가 포함된 디렉토리를 복사해왔거나 서브모듈 디렉토리
git-scm.com
명령어 | 설명 | 비고 |
git stash git stash push | 스택에 새로운 stash 만들기 | git stash save -> git stash push |
git stash list | 저장한 stash 확인 | |
git stash apply git stash apply stash@{0} git stash apply --index | stash를 적용 이름을 지정하지 않으면 가장 최근의 stash를 적용 | Git은 stash를 적용할 때 Staged 상태였던 파일을 자동으로 다시 Staged 상태로 만들어주지 않는다. 따라서 --index 옵션을 주어 Staged 상태까지 적용한다. |
git stash drop git stash drop stash@{0} | stash를 스택에서 삭제 이름을 지정하지 않으면 가장 최근의 stash를 삭제 | |
git stash pop git stash pop stash@{0} | stash를 적용 및 삭제(apply + drop) 이름을 지정하지 않으면 가장 최근의 stash를 적용 및 삭제 | |
git stash branch <브랜치> | 새 브랜치를 생성하여 pop | 충돌사항이 있는 상황 등에 유용 새로운 브랜치에서 안전하게 충돌을 해결할 수 있음 |
끝!