코딩에 푹 빠져서 한창 집중하고 있는데, 갑자기 “지금 운영 서버에 치명적인 버그가 터졌으니 급하게 브랜치 전환해서 핫픽스 좀 해주세요!”라는 요청을 받아보신 적 있으신가요? 😱 저도 개발 초보 시절에는 이런 긴급 상황을 마주할 때마다 정말 눈앞이 캄캄해졌어요. 아직 완성되지도 않은 지저분한 코드를 ‘temp’나 ‘임시저장’ 같은 민망한 메시지로 억지로 커밋하거나, 최악의 경우 코드를 통째로 메모장에 복사해 두고 브랜치를 오가곤 했거든요.
하지만 Git에는 이런 상황을 단 몇 초 만에 깔끔하게 해결해 주는 마법 같은 구원투수가 있습니다. 바로 Git Stash예요! 작업 디렉터리의 수정 사항을 비밀 서랍 속에 쏙 넣어두듯 안전하게 치워두었다가, 다른 급한 일을 마친 뒤 언제든 다시 꺼내 쓸 수 있는 아주 든든한 기능이랍니다. 오늘은 Git Stash의 핵심 개념부터 필수 명령어, 그리고 실무에서 마주치는 꿀팁까지 제가 차근차근 알려드릴게요! 😊
1. Git Stash란 무엇이고 언제 사용할까요? 🤔
‘Stash’는 영어로 ‘안전한 곳에 넣어두다, 숨겨두다’라는 의미를 담고 있어요. 즉, Git Stash는 아직 커밋(Commit)할 준비가 되지 않은 작업 중인 변경 사항들을 임시 저장 스택(Stack)에 살짝 보관해 두는 기능입니다. 이 명령어를 실행하면 지저분했던 작업 공간이 마지막 커밋 상태(HEAD)로 깨끗하게 되돌아가요.
제가 실무를 하면서 Stash를 가장 유용하게 꺼내 쓰는 대표적인 세 가지 순간이 있습니다.
- 갑작스러운 브랜치 전환: 다른 브랜치로 체크아웃해야 하는데 현재 수정한 파일들 때문에 Git이 브랜치 이동을 거부할 때
- 원격 저장소 풀(Pull) 충돌 방지: 팀원의 최신 커밋을 내려받아야 하는데 내 로컬 변경점과 엉킬까 봐 불안할 때
- 엉뚱한 브랜치에서 코딩했을 때: 새 기능 브랜치가 아니라 메인 브랜치에서 작업하던 코드를 그대로 안전하게 옮겨와야 할 때
Git Stash는 기본적으로 Git이 이미 버전을 추적하고 있는 ‘Tracked 파일’만 저장해요. 프로젝트에 새로 만들어 한 번도 git add를 거치지 않은 ‘Untracked 파일’은 기본 명령어로 저장되지 않으므로 추가 옵션이 필요합니다!
2. 핵심 명령어 4총사 비교와 활용법 📊
Git Stash는 주로 네 가지 핵심 명령어만 머릿속에 넣어두면 실무의 90% 이상을 막힘없이 다룰 수 있습니다. 특히 가장 혼동하기 쉬운 pop과 apply의 차이를 짚고 넘어가는 게 핵심이에요.
| 구분 | 명령어 | 주요 동작 | 실무 특징 |
|---|---|---|---|
| 임시 저장 | git stash |
작업 트리 수정 사항을 스택에 보관 | 워킹 디렉터리가 즉시 깨끗해짐 |
| 목록 조회 | git stash list |
저장된 스태시 전체 목록 확인 | stash@{0}, stash@{1} 순서로 표기 |
| 복원 후 삭제 | git stash pop |
최신 스태시 적용 후 스택에서 제거 | 단발성 작업 복원에 가장 빈번하게 사용 |
| 복원 후 유지 | git stash apply |
최신 스태시 적용하되 스택에 보존 | 여러 브랜치에 동일 변경 적용 시 유리 |
이 둘을 일상에 빗대어 쉽게 이해해 볼까요? pop은 서랍에서 물건을 완전히 꺼내어 쓰는 것이고, apply는 서랍 속 서류를 복사해서 쓰고 원본은 그대로 남겨두는 것이에요. 실수를 방지하고 싶거나 백업이 필요하다면 apply를 먼저 사용해 보는 것도 안전한 전략이랍니다.
git stash pop을 실행했을 때 현재 브랜치 코드와 충돌(Conflict)이 발생하면, Git은 소중한 코드가 유실되는 것을 막기 위해 스태시를 목록에서 자동으로 지우지 않습니다. 충돌을 모두 수정한 뒤 중복 적용을 막으려면 반드시 수동으로 git stash drop을 입력해 정리해 주세요!
3. 놓치기 쉬운 필수 옵션과 상황별 명령어 도구 🧮
그냥 옵션 없이 git stash만 반복해서 쓰다 보면 나중에 목록에 쌓인 작업물이 무엇인지 기억나지 않거나, 새로 생성했던 파일이 누락되어 곤혹스러울 때가 많아요. 실무 효율을 수직 상승시켜 주는 세 가지 핵심 옵션을 꼭 기억해 두세요.
📝 실무에서 매일 쓰는 알짜배기 옵션 모음
1) 신규 파일까지 통째로 보관: git stash -u (Untracked 파일까지 누락 없이 보관)
2) 알아보기 쉬운 메시지 지정: git stash push -m "로그인 폼 UI 작업중" (목록에서 바로 식별 가능)
3) 선택적 삭제 및 전체 청소: git stash drop stash@{0} (특정 항목 제거), git stash clear (전체 비우기)
🔢 상황별 Git Stash 명령어 생성기
4. 실전 예시: 엉뚱한 브랜치에서 코딩했을 때 탈출법 📚
개발자라면 누구나 한 번쯤 메인(main) 브랜치나 엉뚱한 배포 브랜치에서 몇 시간 동안 신나게 코딩하다가 뒤늦게 식은땀을 흘려본 기억이 있을 거예요. 커밋을 생성하기 전이라면 Git Stash로 30초 만에 완벽하게 복구할 수 있습니다.
사례: 김개발 님의 잘못된 브랜치 작업 구출 작전
- 현재 상황: 새 브랜치를 파지 않고 main 브랜치에서 파일 3개를 수정하고 새 컴포넌트 1개를 추가함
- 해결 목표: 작성한 모든 코드를 온전히 보존하면서 새 브랜치인
feature/login으로 작업물 옮기기
3단계 탈출 가이드
1) 작업물 전체 임시 보관: git stash -u 명령어를 실행하여 새 파일까지 깔끔하게 서랍에 넣고 main 브랜치를 청소합니다.
2) 새 브랜치 생성 및 전환: git switch -c feature/login 으로 작업이 이루어졌어야 할 올바른 브랜치로 이동합니다.
3) 작업물 불러오기: git stash pop 을 실행하면 숨겨뒀던 코드들이 새 브랜치에 그대로 복원됩니다!
최종 결과
– main 브랜치: 불필요한 수정 흔적 없이 깔끔한 원본 상태 유지
– feature/login 브랜치: 공들여 작성한 코드가 고스란히 이동되어 바로 이어서 개발 및 커밋 가능
Stash는 특정 브랜치에 귀속되지 않고 Git 저장소 전체가 공유하는 ‘글로벌 공간’이에요. 그렇기 때문에 A 브랜치에서 stash로 숨겨두고 B 브랜치로 이동한 뒤 pop을 실행하면, 작업하던 변경 사항을 아주 자연스럽게 브랜치 간에 이동시킬 수 있답니다!
5. 마무리: 핵심 내용 요약 📝
오늘 함께 살펴본 Git Stash의 핵심 포인트를 네 줄로 일목요연하게 정리해 드릴게요.
- 작업 중단 시 임시 보관: 미완성 코드를 지저분하게 커밋하지 말고
git stash로 서랍에 넣어두세요. - 새 파일 누락 방지: 새로 만든 untracked 파일이 있다면 반드시
-u옵션을 붙여야 안전합니다. - 메모 습관화:
push -m "메시지"를 활용해 스태시가 쌓여도 나중에 헤매지 않도록 이름을 붙여주세요. - pop과 apply의 구분: 꺼내고 바로 지울 때는 pop, 안전하게 남겨두고 싶을 때는 apply를 선택하세요.
Git Stash 핵심 요약 치트시트
apply (불러오고 유지)
자주 묻는 질문 ❓
git stash -u 또는 git stash --include-untracked 옵션을 사용하셔야 합니다.git stash drop으로 수동 삭제해 주시면 됩니다.git stash list로 목록을 확인한 뒤, 원하는 인덱스 번호를 지정하여 git stash apply stash@{1} 또는 git stash pop stash@{1} 형태로 실행하면 원하는 작업만 콕 집어 복원할 수 있습니다.git fsck --unreachable 또는 reflog 추적을 통해 분실된 커밋(dangling commit) 해시를 찾은 뒤, 해당 해시를 체크아웃하거나 stash apply로 불러올 수 있습니다.
여기까지 Git Stash를 활용해 작업 중이던 코드를 깔끔하게 임시 저장하고 안전하게 복원하는 방법을 살펴보았습니다. 이제 더 이상 미완성 코드를 억지로 커밋하거나 메모장에 붙여넣으며 스트레스받지 마시고, Git Stash를 적극적으로 활용해 스마트한 개발 워크플로우를 완성해 보세요! 읽으시면서 궁금한 점이나 막히는 부분이 있다면 댓글로 편하게 물어봐주세요~ 😊