| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- SWIFT
- 상속
- spring boot
- Sequelize
- 개발자
- node.js
- Nest.js
- 반복문
- vue
- 코틀린
- props
- AWS
- file upload
- react
- Kotlin
- back-end
- 개발이 취미인 사람
- It
- 개발이취미인사람
- 조건문
- java
- component
- state
- swagger
- front-end
- Producer
- javascript
- jpa
- restful api
- kafka
- Today
- Total
개발이 취미인 사람
[Git] - Git Stash - 임시 저장 활용법 본문
개요
안녕하세요. 이번 시간에는 Git Stash에 대해 알아보겠습니다. Stash는 작업 중인 변경사항을 임시로 저장하는 기능으로, 브랜치 전환이나 긴급 작업 시 매우 유용합니다. 실무에서 자주 사용하는 필수 기능이니 꼭 익혀두시기 바랍니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.
[Git] - Pull Request(PR) / Merge Request(MR) 작성법
- Stash란?
Stash는 현재 작업 중인 변경사항을 임시로 저장해두는 Git의 기능입니다. 커밋하지 않은 변경사항을 안전하게 보관하고, 나중에 다시 불러올 수 있습니다.

Stash의 필요성
상황 1: 기능 개발 중인데 긴급 버그 수정 요청이 들어옴
- 현재 작업을 커밋하기엔 아직 완성되지 않음
- 하지만 브랜치를 전환해야 함
- 해결: Stash로 임시 저장!
상황 2: 잘못된 브랜치에서 작업함
- develop에서 작업해야 하는데 main에서 작업 중
- 변경사항을 이동시켜야 함
- 해결: Stash로 저장하고 올바른 브랜치로 이동!
상황 3: pull 전에 로컬 변경사항이 있음
- git pull을 해야 하는데 충돌 우려
- 해결: Stash로 저장하고 pull 후 복원!
Stash 저장 위치
Working Directory Stash Stack Repository
(작업 디렉토리) (임시 저장소) (저장소)
| | |
| git stash save | |
| ----------------> | |
| | |
| git stash pop | |
| <---------------- | |
Stash는 스택(Stack) 구조로 관리됩니다. 가장 최근에 저장한 것이 가장 먼저 나옵니다.
- Stash 기본 명령어
1. 변경사항 저장하기
# 기본 stash 저장
git stash
# 또는
git stash save
# 메시지와 함께 저장 (권장)
git stash save "작업 내용 설명"
# 예시
git stash save "로그인 기능 작업 중"
# 출력
Saved working directory and index state On feature/login: 로그인 기능 작업 중
2. Stash 목록 확인하기
# 저장된 stash 목록 보기
git stash list
# 출력 예시
stash@{0}: On feature/login: 로그인 기능 작업 중
stash@{1}: WIP on main: a1b2c3d Update README
stash@{2}: On develop: 결제 모듈 테스트
stash 번호 이해하기:
- stash@{0}: 가장 최근에 저장한 stash
- stash@{1}: 그 이전에 저장한 stash
- stash@{2}: 더 이전에 저장한 stash

3. Stash 내용 확인하기
# 가장 최근 stash의 변경사항 확인
git stash show
# 출력
src/login.js | 15 +++++++++++++++
src/auth.js | 8 ++++++--
2 files changed, 21 insertions(+), 2 deletions(-)
# 상세 변경 내용 확인 (diff)
git stash show -p
# 특정 stash 확인
git stash show stash@{1}
git stash show -p stash@{1}
4. Stash 복원하기
# 방법 1: pop (복원 후 stash 삭제) - 일반적으로 사용
git stash pop
# 특정 stash를 pop
git stash pop stash@{1}
# 방법 2: apply (복원 후 stash 유지)
git stash apply
# 특정 stash를 apply
git stash apply stash@{2}
pop vs apply 차이:
명령어 복원 stash 보존 사용 시점
| pop | ✅ | ❌ 삭제됨 | 일반적인 경우 (권장) |
| apply | ✅ | ✅ 유지됨 | 여러 브랜치에 적용해야 할 때 |
5. Stash 삭제하기
# 가장 최근 stash 삭제
git stash drop
# 특정 stash 삭제
git stash drop stash@{1}
# 모든 stash 삭제
git stash clear
# 삭제 전 확인
git stash list

- Stash 고급 사용법
1. Untracked 파일도 함께 저장
기본적으로 stash는 추적 중인(tracked) 파일만 저장합니다.
# 새로 생성한 파일(untracked)도 함께 저장
git stash save -u "메시지"
# 또는
git stash save --include-untracked "메시지"
# 예시
echo "새 파일" > new-file.txt
git stash save -u "새 파일 포함하여 저장"
2. 특정 파일만 Stash
# 특정 파일만 stash (Git 2.13+)
git stash push -m "메시지" 파일1 파일2
# 예시
git stash push -m "로그인 파일만 저장" src/login.js src/auth.js
3. Stash를 브랜치로 만들기
stash를 새로운 브랜치로 만들 수 있습니다.
# stash를 새 브랜치로 생성
git stash branch 브랜치명
# 예시
git stash branch feature/stashed-work
# 결과:
# 1. 새 브랜치 생성
# 2. stash 내용이 자동으로 적용됨
# 3. stash가 자동으로 삭제됨
4. Stash를 커밋으로 확인
# stash는 내부적으로 커밋입니다
# stash의 커밋 해시 확인
git stash list --format="%gd: %H"
# 출력
stash@{0}: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
- 실전 시나리오

시나리오 1: 긴급 버그 수정
# 상황: feature/payment 브랜치에서 결제 기능 개발 중
# 긴급: main 브랜치의 버그를 수정해야 함
# 1. 현재 작업 저장
git stash save "결제 기능 개발 중"
# 2. 상태 확인 (깨끗한 상태)
git status
# On branch feature/payment
# nothing to commit, working tree clean
# 3. main 브랜치로 이동
git checkout main
# 4. 버그 수정
# ... 버그 수정 작업 ...
git add .
git commit -m "fix: 긴급 버그 수정"
# 5. 다시 feature/payment로 돌아가기
git checkout feature/payment
# 6. 저장했던 작업 복원
git stash pop
# 7. 계속 작업
# ... 결제 기능 개발 계속 ...
시나리오 2: 잘못된 브랜치에서 작업
# 상황: main 브랜치에서 작업했는데, develop에서 했어야 함
# 1. 변경사항 확인
git status
# On branch main
# Changes not staged for commit:
# modified: src/app.js
# 2. 현재 작업 저장
git stash save "develop에서 작업해야 하는 내용"
# 3. 올바른 브랜치로 이동
git checkout develop
# 4. 저장했던 작업 복원
git stash pop
# 5. 이제 올바른 브랜치에서 작업 계속
git add .
git commit -m "feat: 새 기능 추가"
시나리오 3: Pull 전에 로컬 변경사항 처리
# 상황: 원격 저장소를 pull 해야 하는데 로컬에 변경사항이 있음
# 1. 현재 작업 저장
git stash save "pull 전 로컬 작업"
# 2. 원격 저장소에서 최신 코드 가져오기
git pull origin develop
# 3. 저장했던 작업 복원
git stash pop
# 4. 충돌이 발생하면 해결
# ... 충돌 해결 ...
git add .
시나리오 4: 여러 브랜치에 같은 수정 적용
# 상황: 같은 버그 수정을 여러 브랜치에 적용해야 함
# 1. 버그 수정 작업
# ... 버그 수정 ...
# 2. 수정 내용을 stash로 저장
git stash save "공통 버그 수정"
# 3. 첫 번째 브랜치에 적용
git checkout feature/login
git stash apply # apply 사용 (stash 유지)
git add .
git commit -m "fix: 버그 수정"
# 4. 두 번째 브랜치에 적용
git checkout feature/payment
git stash apply # 같은 stash를 다시 apply
git add .
git commit -m "fix: 버그 수정"
# 5. 세 번째 브랜치에 적용
git checkout feature/profile
git stash pop # 마지막은 pop으로 stash 삭제
git add .
git commit -m "fix: 버그 수정"
- Stash 워크플로우 전체 예시
실제 개발 과정에서의 stash 사용 예시입니다.
# === 오전 9시: 새 기능 개발 시작 ===
git checkout -b feature/user-dashboard
# ... 코딩 ...
echo "대시보드 컴포넌트" > dashboard.js
# === 오전 11시: 긴급 회의로 인한 작업 중단 ===
git stash save "대시보드 기능 개발 중 - 50% 완성"
# === 오후 2시: 다른 긴급 작업 ===
git checkout develop
git checkout -b hotfix/security-issue
# ... 보안 이슈 수정 ...
git commit -m "fix: 보안 취약점 수정"
git checkout develop
git merge hotfix/security-issue
# === 오후 3시: 원래 작업 재개 ===
git checkout feature/user-dashboard
git stash list
# stash@{0}: On feature/user-dashboard: 대시보드 기능 개발 중 - 50% 완성
git stash pop
# ... 작업 계속 ...
# === 오후 5시: 작업 완료 ===
git add .
git commit -m "feat: 사용자 대시보드 구현 완료"
git push origin feature/user-dashboard
- Stash와 Commit 비교

항목 Stash Commit
| 목적 | 임시 저장 | 영구 저장 |
| 공유 | 로컬 전용 | 원격 공유 가능 |
| 히스토리 | 포함 안됨 | 포함됨 |
| 메시지 | 선택 사항 | 필수 |
| 사용 시점 | 작업 중단 시 | 작업 완료 시 |
| 복원 | pop/apply | checkout |
언제 Stash를 쓸까?
✅ Stash 사용:
- 작업이 아직 완성되지 않았을 때
- 임시로 다른 작업을 해야 할 때
- 커밋하기에는 너무 작은 변경일 때
✅ Commit 사용:
- 작업이 완성되었을 때
- 의미있는 변경 단위일 때
- 팀원과 공유해야 할 때
- Stash 충돌 해결
stash를 복원할 때 충돌이 발생할 수 있습니다.
충돌 발생 예시
# stash pop 시도
git stash pop
# 충돌 발생!
Auto-merging src/app.js
CONFLICT (content): Merge conflict in src/app.js
충돌 해결 방법
# 1. 충돌 파일 확인
git status
# 출력
Unmerged paths:
both modified: src/app.js
# 2. 파일 열어서 충돌 부분 수정
# src/app.js 파일 내용:
<<<<<<< Updated upstream
현재 브랜치의 내용
=======
Stash에 저장된 내용
>>>>>>> Stashed changes
# 3. 충돌 해결 후 저장
# ... 원하는 내용으로 수정 ...
# 4. 스테이징
git add src/app.js
# 5. stash 충돌 해결 완료
# (자동으로 stash가 삭제됨)
# 만약 stash를 유지하고 싶다면
git stash drop # 수동으로 삭제
충돌 시 안전하게 취소하기
# 충돌이 복잡해서 취소하고 싶을 때
git reset --merge
# stash는 그대로 유지되므로 나중에 다시 시도 가능
- 자주 하는 실수와 해결법
실수 1: Stash를 까먹음
문제:
git stash save "중요한 작업"
# ... 한참 후 ...
# 어디에 저장했더라?
해결:
# 항상 의미있는 메시지와 함께 저장
git stash save "로그인 기능 - 폼 유효성 검사 추가 중"
# stash 목록 확인
git stash list
실수 2: 여러 개의 Stash가 쌓임
문제:
git stash list
stash@{0}: WIP on main
stash@{1}: WIP on develop
stash@{2}: WIP on feature
stash@{3}: WIP on bugfix
# ... 너무 많아!
해결:
# 필요없는 stash 정리
git stash drop stash@{3}
git stash drop stash@{2}
# 또는 특정 stash를 최신으로 만들기
git stash apply stash@{3}
git stash drop stash@{3}
git stash save "정리한 작업"
# 모두 삭제하고 새로 시작
git stash clear
실수 3: Stash 했는데 파일이 사라짐
문제:
git stash save
# 어? 파일이 다 사라졌어!
설명:
Stash는 정상 작동한 것입니다!
- stash는 변경사항을 "임시 보관"하고
- 작업 디렉토리를 "깨끗한 상태"로 만듭니다
복원:
# 바로 복원하면 됩니다
git stash pop
실수 4: Stash Pop 후 충돌 발생
문제:
git stash pop
# 충돌 발생... 어떻게 하지?
주의:
충돌이 발생하면 stash가 자동으로 삭제되지 않습니다!
수동으로 충돌을 해결한 후 drop 해야 합니다.
해결:
# 1. 충돌 해결
# ... 파일 수정 ...
git add .
# 2. stash 수동 삭제
git stash drop
# 또는 처음부터 apply 사용
git stash apply # 충돌 해결 후에도 stash 유지
실수 5: 잘못된 Stash를 Pop
문제:
git stash pop
# 어? 이게 아닌데...
해결:
# 1. 바로 다시 stash로 저장
git stash save "다시 저장"
# 2. 원하는 stash 찾기
git stash list
# 3. 올바른 stash 복원
git stash pop stash@{1}
- Stash 명령어 정리
# === 저장 ===
git stash # 현재 변경사항 저장
git stash save "메시지" # 메시지와 함께 저장
git stash save -u "메시지" # untracked 파일 포함
git stash push -m "메시지" 파일명 # 특정 파일만 저장
# === 확인 ===
git stash list # stash 목록 보기
git stash show # 최근 stash 변경사항
git stash show -p # 최근 stash 상세 내용
git stash show stash@{N} # 특정 stash 확인
# === 복원 ===
git stash pop # 최근 stash 복원 및 삭제
git stash pop stash@{N} # 특정 stash 복원 및 삭제
git stash apply # 최근 stash 복원 (유지)
git stash apply stash@{N} # 특정 stash 복원 (유지)
# === 삭제 ===
git stash drop # 최근 stash 삭제
git stash drop stash@{N} # 특정 stash 삭제
git stash clear # 모든 stash 삭제
# === 고급 ===
git stash branch 브랜치명 # stash를 브랜치로 만들기
- Stash 사용 팁
1. 의미있는 메시지 작성
❌ 나쁜 예:
git stash save "임시"
git stash save "작업중"
✅ 좋은 예:
git stash save "로그인 폼 - 이메일 유효성 검사 추가 중"
git stash save "결제 API 연동 - 테스트 코드 작성 전"
2. 주기적으로 Stash 정리
# 일주일에 한 번 정도 확인
git stash list
# 필요없는 것은 삭제
git stash drop stash@{5}
git stash drop stash@{4}
# 또는 필요한 것만 남기고 모두 삭제
git stash clear
3. Stash 전에 Diff 확인
# stash 하기 전에 무엇이 저장되는지 확인
git diff
# 변경사항 확인 후 stash
git stash save "확인한 변경사항"
4. Pop 대신 Apply 사용 고려
# 안전하게 apply로 먼저 확인
git stash apply
# 문제 없으면 수동으로 삭제
git stash drop
# 문제 있으면 다시 reset
git reset --hard
5. 브랜치 전환 전에 항상 확인
# 브랜치 전환 전에
git status
# 변경사항이 있다면
git stash save "브랜치 전환 전 작업"
# 그 다음 브랜치 전환
git checkout other-branch
마무리
이번 시간에는 Git Stash의 사용법에 대해 알아봤습니다. Stash는 작업 중인 변경사항을 임시로 저장하는 매우 유용한 기능입니다. 브랜치 전환, 긴급 작업, pull 전 변경사항 처리 등 실무에서 자주 사용하게 되니 꼭 익숙해지시길 바랍니다. 특히 git stash pop과 git stash apply의 차이를 이해하고, 의미있는 메시지와 함께 저장하는 습관을 들이는 것이 중요합니다.
다음 시간에는 Git Tag - 버전 관리 및 릴리즈에 대해 알아보겠습니다.
'컴퓨터공학 > Git' 카테고리의 다른 글
| [Git] - Git Tag - 버전 관리 및 릴리즈 (0) | 2025.12.27 |
|---|---|
| [Git] - Pull Request(PR) / Merge Request(MR) 작성법 (0) | 2025.12.25 |
| [Git] - Clone vs Fork 차이점 (0) | 2025.12.24 |
| [Git] - push, pull, fetch 명령어 이해 (0) | 2025.12.23 |
| [Git] - 충돌(Conflict) 해결 방법 (0) | 2025.12.22 |