📦

stash 제대로 쓰기

작업 중 브랜치 전환이 필요할 때

작업 중인데 갑자기 다른 브랜치로 넘어가야 할 때가 있다. 커밋하기엔 어설프고, 버리기엔 아까운 변경들.

이때 git stash를 쓴다.

기본 동작

git stash push는 tracked 파일의 변경을 스택에 저장하고 working tree를 HEAD 상태로 되돌린다. 나중에 git stash pop으로 꺼내면 변경이 다시 적용된다.

untracked 파일을 포함하려면 -u, ignored 파일까지는 -a 옵션.

stash는 스택이다

여러 개 쌓을 수 있다. git stash list로 보고, git stash apply stash@{2}로 특정 항목만 꺼낼 수도 있다. pop은 꺼내면서 삭제, apply는 꺼내기만 한다.

메시지를 붙이자

git stash push -m '리팩토링 중단'처럼 메시지를 붙이면 나중에 stash list에서 뭐가 뭔지 바로 알 수 있다. 이거 안 하면 3일 뒤에 WIP on main 3개 중 뭐가 뭔지 모른다.

금지 사항 대신 stash

git checkout -- ., git reset --hard, git clean -fd는 모두 변경을 영구 삭제한다. 브랜치 작업이 필요하면 무조건 stash로 시작한다. 작업이 끝난 뒤 stash pop으로 복원하면 된다.

동작 흐름

1

`git stash push -m "메시지"` → 변경 저장, working tree 클린

2

`git stash list` → 쌓인 stash 목록 확인

3

`git stash pop` → 최상위 stash 복원하고 삭제

4

`git stash apply stash@{N}` → 특정 항목만 복원 (삭제 안 함)

5

`git stash drop stash@{N}` / `git stash clear` → 삭제

장점

  • working tree를 안전하게 비움
  • reflog와 별개로 stash 이력 유지

단점

  • 쌓여서 잊으면 찾기 힘듦
  • merge conflict가 발생할 수 있음 (pop 시)

사용 사례

긴급 bugfix 때문에 다른 브랜치로 전환 pull --rebase 전 로컬 변경 임시 보관 cherry-pick, merge 전 작업 정리

참고 자료