CATEGORY

카테고리 (671)
AI (69)
Language & Specs (260)
FrameWork (36)
Library (20)
App (41)
Git (10)
Build & Dependency (2)
AWS (15)
DataBase (45)
OS (33)
Tool (17)
IT (120)
반응형
SEEMINGLY ONLINE

Seemingly
Online

이모저모 방방곡곡 두루두루 개발지식 저장소

RECENT POSTS

Git/Git

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