Quick Flow
# 현재 변경을 이름과 함께 임시 저장
git stash push -m "wip: login form validation"
# 다른 브랜치로 이동해 긴급 작업 처리
git switch main
# 원래 브랜치로 돌아와 복원
git switch feature/login
git stash pop문법
어떤 임시 보관 흐름을 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 잠깐 다른 브랜치로 이동 | git stash push -m "..." |
| 복원 결과를 먼저 확인 | git stash apply |
| 적용 후 stash까지 제거 | git stash pop |
| untracked 파일도 함께 보관 | git stash push -u |
| 오래 보관할 작업 | 임시 커밋 또는 draft 브랜치 |
stash가 필요한 이유 — 커밋하기 애매한 중간 상태가 브랜치 전환을 막는다
Git은 브랜치를 전환하기 전에 작업 트리가 깨끗해야 한다고 항상 강제하지는 않지만, 변경한 path가 전환 대상과 충돌하면 switch가 거부될 수 있습니다. 커밋하기엔 아직 불완전한 상태에서 긴급히 이동해야 할 때 stash가 도움이 됩니다. stash는 선택한 worktree·index 변경을 stash ref에 보관하고 worktree를 기준 commit 상태로 되돌립니다. 내부 object 구조보다 어떤 path를 포함했고 어느 branch에서 만든 stash인지가 복원 판단에 더 중요합니다.
pop과 apply의 차이 — 불확실하면 apply가 더 안전하다
git stash pop은 스택에서 최신 stash를 꺼내 적용하고 동시에 stash 목록에서 제거한다. git stash apply는 적용만 하고 stash 목록에는 남긴다. 복원이 제대로 됐는지 확인하기 전에 stash를 잃고 싶지 않다면 apply를 먼저 쓰고 확인 후 git stash drop으로 명시적으로 제거하는 것이 더 안전하다. pop 중 충돌이 발생하면 stash는 제거되지 않고 남아 있다는 점도 알아 두면 혼란을 줄일 수 있다. 스택 구조이므로 특정 stash를 지정할 때는 git stash apply stash@{2} 형태로 인덱스를 명시한다.
# 먼저 확인하면서 복원
git stash apply stash@{0}
git status
git stash drop stash@{0}
# 바로 적용 + 제거
git stash popstash는 단기 컨텍스트 전환에 적합하다
stash는 LIFO(Last In First Out) stack이라 나중에 넣은 것이 먼저 나옵니다. 여러 개가 쌓이면 stash@{0}, stash@{1} 형태로 관리해야 하므로 어느 branch의 어떤 작업인지 잊기 쉽습니다. 다음 session이나 다른 clone에도 남겨야 하는 작업, review할 작업, rollback 기준이 필요한 작업은 git commit -m "wip: ..."을 만들고 draft branch에 push하는 편이 검색성과 보존 범위가 명확합니다.
untracked 파일을 stash에 포함하려면 옵션이 필요하다 — 기본 동작의 범위를 알아야 한다
git stash push 기본 동작은 추적 중인 파일의 변경(작업 트리 + 스테이징)만 저장하고, untracked 파일은 제외한다. untracked 파일까지 포함하려면 -u 또는 --include-untracked를 추가해야 한다. 새로 생성한 파일이 stash 후에도 작업 트리에 남아 있다면 untracked 파일이 포함되지 않은 것이다. -u 옵션을 쓰면 새 파일도 함께 저장되어 브랜치 전환 후 깨끗한 상태가 된다. .gitignore에 등록된 파일까지 포함하려면 -a (--all) 옵션을 쓴다.
touch draft.md
git stash push -m "wip"
# draft.md는 그대로 남음 (untracked는 기본 stash에 포함되지 않음)
git stash push -u -m "wip with untracked"선택 기준
| 상황 | 적합한 선택 |
|---|---|
| 잠깐 브랜치를 바꾸고 바로 돌아올 때 | git stash push -m "..." → git stash pop |
| 복원 결과를 확인하고 나서 stash 제거 | git stash apply → 확인 → git stash drop |
| 새로 만든 파일도 함께 stash에 포함 | git stash push -u -m "..." |
| 한 시간 이상 보관해야 하는 작업 | git commit -m "wip: ..." 또는 draft 브랜치 |
| stash 목록 확인 | git stash list |
주의할 점
stash를 장기 저장처럼 쓰면 "어느 브랜치의 어떤 작업인지"를 잃어버리기 쉽습니다.
다음 session·다른 clone·review까지 필요하면 stash보다 임시 커밋과 draft 브랜치가 더 안전합니다.
또한 기본 stash는 untracked 파일을 포함하지 않으므로 새 파일이 있다면
-u 옵션을 함께 쓰세요.
참고 링크
1 sources