1 Stash란?
작업 도중 급히 다른 브랜치로 전환해야 하는 상황이 있다:
- 긴급 버그 수정 요청이 들어왔다
- 코드 리뷰를 위해 다른 브랜치를 확인해야 한다
- 현재 작업은 아직 커밋할 단계가 아니다
이때 Stash를 사용하면 현재 변경사항을 임시로 저장하고, 나중에 다시 꺼내올 수 있다.
Working Directory (작업 중)
↓ git stash
Stash Stack (임시 저장)
↓ git stash pop
Working Directory (복원)
2 기본 사용법
2.1 변경사항 임시 저장
Saved working directory and index state WIP on feature/login: abc1234 로그인 폼 추가
WIP on <브랜치>: <해시> <마지막 커밋 메시지> 형식으로 저장됐음을 알린다.
Saved working directory and index state On feature/login: 로그인 기능 작업 중
-m 옵션을 사용하면 WIP on ... 대신 지정한 메시지가 표시된다. 나중에 git stash list 에서 구분이 쉬워진다.
2.2 저장된 stash 확인
stash@{0}: On feature/login: 로그인 기능 작업 중
stash@{1}: WIP on main: def5678 메인 페이지 수정 중
stash@{0} 이 가장 최근에 저장된 항목이다. 숫자가 작을수록 최신이다.
2.3 변경사항 복원
On branch feature/login
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: src/login.js
Dropped stash@{0} (7d9b3a2c4f1e8b5d6c7a8f9e0b1d2c3a)
복원된 파일 목록과 함께 Dropped stash@{0} 이 출력되면 stash 목록에서 제거된 것이다.
On branch feature/login
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: src/login.js
Dropped 줄이 없으면 stash가 목록에 그대로 남아 있는 것이다. git stash list 로 확인하면 여전히 stash@{0} 이 보인다.
pop vs apply:
| 명령어 | 복원 | stash 목록에서 제거 |
|---|---|---|
git stash pop |
O | O |
git stash apply |
O | X (유지) |
apply는 여러 브랜치에 같은 변경사항을 적용하고 싶을 때 유용하다.
2.4 stash 삭제
Dropped stash@{0} (7d9b3a2c4f1e8b5d6c7a8f9e0b1d2c3a)
성공 시 아무 출력도 없다.
3 Stash 고급 사용법
3.1 추적되지 않는 파일도 함께 stash
기본적으로 git stash는 추적 중인 파일의 변경사항만 저장한다. 새로 생성한 파일(untracked)도 함께 저장하려면:
3.2 stash 내용 확인
src/login.js | 12 ++++++------
src/utils.py | 5 +++++
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/src/login.js b/src/login.js
index a1b2c3d..e4f5g6h 100644
--- a/src/login.js
+++ b/src/login.js
@@ -10,6 +10,12 @@ function login() {
+ const token = generateToken();
+ storeToken(token);
3.3 특정 파일만 stash
3.4 stash에서 브랜치 생성
stash를 적용할 때 충돌이 발생하면, 새 브랜치를 만들어서 적용하는 것이 안전하다.
Switched to a new branch 'new-branch-name'
On branch new-branch-name
Changes not staged for commit:
modified: src/login.js
Dropped stash@{0} (7d9b3a2c4f1e8b5d6c7a8f9e0b1d2c3a)
새 브랜치로 전환되고 stash 내용이 적용된 후 자동으로 stash가 삭제된다.
4 실전 시나리오
4.1 시나리오 1: 긴급 버그 수정
# 1. 현재 feature 작업 중... 긴급 버그 수정 요청!
# 2. 현재 작업 임시 저장
git stash push -m "feature/login 작업 중"
# 3. main 브랜치로 이동
git switch main
git pull
# 4. hotfix 브랜치 생성 및 버그 수정
git switch -c hotfix/critical-bug
# ... 버그 수정 ...
git add .
git commit -m "fix: Critical bug in payment"
git push -u origin hotfix/critical-bug
# 5. 원래 브랜치로 돌아오기
git switch feature/login
# 6. 임시 저장한 작업 복원
git stash pop4.2 시나리오 2: 작업 브랜치를 잘못 선택한 경우
4.3 시나리오 3: 여러 실험을 각각 저장
5 주의사항
Stash는 로컬 전용이다. 원격 저장소에 push되지 않는다.
Stash를 오래 쌓아두면 어떤 내용인지 잊기 쉽다. 항상
-m옵션으로 설명을 남기자.git stash pop시 충돌이 발생하면 stash가 삭제되지 않는다 (수동으로git stash drop필요).충돌 발생 시 출력:
Auto-merging src/login.js CONFLICT (content): Merge conflict in src/login.js The stash entry is kept in case you need it again.충돌 파일을 수동으로 해결한 후
git stash drop stash@{0}으로 stash를 삭제한다.Stash가 많이 쌓이면 관리가 어렵다. 가능하면 빨리 복원하거나 WIP 커밋을 사용하는 것을 고려하자.
6 요약
| 명령어 | 동작 |
|---|---|
git stash |
변경사항 임시 저장 |
git stash push -m "설명" |
메시지와 함께 저장 |
git stash -u |
새 파일 포함하여 저장 |
git stash list |
저장 목록 확인 |
git stash show -p |
내용 상세 확인 |
git stash pop |
복원 + 삭제 |
git stash apply |
복원 (삭제 안 함) |
git stash drop |
특정 stash 삭제 |
git stash clear |
전체 삭제 |
git stash branch <name> |
stash로 브랜치 생성 |