git stash 사용법 — pop·apply·특정 파일·충돌 정리
git stash는 아직 커밋하지 않은 작업 변경을 잠시 치워 두고, 작업 디렉터리를 마지막 커밋 상태로 되돌리는 명령입니다. 브랜치를 급하게 바꿔야 하는데 지금 하던 게 어중간할 때 씁니다. 치운 변경은 git stash pop으로 다시 꺼내는데, pop은 꺼내면서 stash를 지우고, apply는 꺼내되 stash를 남깁니다. 아래 모든 명령은 git 2.43.0에서 실제로 돌린 출력과 함께 정리했습니다.
1. 기본 흐름 — 치우기 → 목록 → 되돌리기
변경이 있는 상태에서 git stash만 치면 됩니다. 그러면 변경이 스택에 쌓이고 작업 디렉터리는 깨끗해집니다.
$ git stash
Saved working directory and index state WIP on master: ac7cf90 init
$ git stash list
stash@{0}: WIP on master: ac7cf90 init
$ git stash pop
Dropped refs/stash@{0} (a5efe2634d37ed9bdc990f8ed3190c0fa00336e6)
git stash— 변경을 치운다(=git stash push의 축약형).git stash list— 치워 둔 목록을 본다. 가장 최근이stash@{0}.git stash pop— 가장 최근 stash를 되돌리고 목록에서 지운다(Dropped ...줄).
git stash는 기본적으로 추적(tracked) 파일의 변경만 치웁니다. git add도 안 한 새 파일(untracked)은 그대로 남습니다. 새 파일까지 치우려면 -u 옵션이 필요합니다(4번).
2. pop vs apply — 무엇이 다른가
둘 다 stash를 작업 디렉터리에 되돌립니다. 차이는 되돌린 뒤 그 stash를 지우느냐입니다.
| 명령 | 되돌린 뒤 stash | 언제 |
|---|---|---|
git stash pop |
삭제됨 (apply + drop) | 한 곳에 한 번만 되돌릴 때 (대부분) |
git stash apply |
남아 있음 | 같은 변경을 여러 브랜치에 적용할 때 |
apply로 되돌린 stash는 목록에 그대로 남으므로, 다 쓰고 나면 git stash drop으로 직접 지웁니다. 특정 stash를 지목할 땐 git stash drop stash@{1}처럼 번호를 붙입니다.
3. 자주 쓰는 옵션
메시지 붙이기 — 나중에 알아보게
WIP on master...는 어떤 작업인지 알 수 없습니다. -m으로 설명을 답니다.
$ git stash push -m "결제화면 작업중"
$ git stash list
stash@{0}: On master: 결제화면 작업중
새 파일(untracked)까지 치우기 — -u
앞서 말했듯 기본 git stash는 새 파일을 남깁니다. -u(--include-untracked)를 붙이면 git add 안 한 새 파일도 함께 치워집니다.
$ git stash push -u -m "새 파일 포함"
특정 파일만 치우기
파일 경로를 주면 그 파일 변경만 stash됩니다. 나머지 변경은 작업 디렉터리에 그대로 남습니다.
$ git stash push -m "a만" a.txt
$ git status -s
M b.txt # a.txt만 치워지고 b.txt 변경은 남았다
4. pop 하다 충돌 나면? — stash는 안 지워진다 (중요)
stash를 치운 사이 같은 줄을 다르게 커밋했다면, pop이 병합 충돌을 냅니다. 이때 git은 stash를 지우지 않고 남겨 둡니다. 되돌리기에 실패했으니 다시 시도할 수 있게 보관하는 것입니다.
$ git stash pop
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
The stash entry is kept in case you need it again. # ← 안 지워짐
$ git stash list
stash@{0}: On master: demo # 여전히 남아 있다
그래서 충돌을 손으로 해결한 뒤에는 stash를 직접 지워야 합니다. 안 지우면 목록에 계속 쌓입니다.
# 1) 충돌 표시(<<<<<<< ======= >>>>>>>)를 편집해 해결
# 2) 해결한 파일을 add
$ git add a.txt
# 3) 보관돼 있던 stash를 직접 삭제
$ git stash drop
pop이 stash를 지웠다고 착각하고 다시 pop을 치면 엉뚱한 결과가 납니다. 충돌 시엔 stash가 남아 있다는 걸 기억하세요. 잘못 커밋한 병합을 되돌려야 한다면 git merge 취소 방법도 함께 참고하세요.
자주 묻는 질문 (FAQ)
Q. stash가 여러 개일 때 특정 것만 꺼내려면?
git stash pop stash@{2}처럼 번호를 지정합니다. apply도 같은 방식(git stash apply stash@{2})입니다. 번호는 git stash list로 확인합니다.
Q. stash에 뭘 넣었는지 내용을 미리 보고 싶어요.
git stash show stash@{0}은 요약을, git stash show -p stash@{0}은 실제 diff를 보여줍니다.
Q. 치워 둔 걸 다 지우려면?
git stash clear가 목록을 전부 비웁니다. 되돌릴 수 없으니 주의하세요. 하나만 지울 땐 git stash drop입니다.
Q. git stash와 git stash push는 다른가요?
같습니다. git stash는 git stash push의 축약입니다. 다만 메시지(-m)·특정 파일 지정은 push 형식에서만 됩니다.
마무리
정리하면, 급히 브랜치를 바꿔야 할 때 git stash로 치우고 git stash pop으로 되돌리는 게 기본입니다. 같은 변경을 여러 곳에 쓰려면 apply, 새 파일까지 치우려면 -u를 기억하세요. 특히 pop 충돌 시 stash가 남는다는 점만 알아 두면 실수를 크게 줄일 수 있습니다.
📚 참고 출처 (2026년 7월 23일 확인 · 명령은 git 2.43.0으로 직접 실행)
· Git 공식 문서(Pro Git) — Stashing과 Cleaning
· Atlassian Git Tutorial — git stash

COMMENTS