[Git 기초] git stash 사용법: 커밋 없이 작업 임시 저장하기 (pop, apply 차이)
git stash 사용법으로 깔끔하게 작업을 임시 저장하고 복원하는 방법을 완벽하게 알려드립니다.
📋 목차
개발자라면 누구나 한 번쯤 겪어봤을 상황입니다. 한창 새로운 기능을 개발하고 있는데, 갑자기 "지금 당장! 급한 버그부터 수정해 주세요!"라는 요청이 들어옵니다. 코드는 여기저기 수정되어 엉망인데, 아직 커밋(commit)하기엔 애매하죠.
이때 다른 브랜치로 git checkout을 시도하면? Git은 "변경 사항을 커밋하거나 스태시하라"는 무서운(?) 메시지를 보냅니다. 바로 이 순간, 마법처럼 우리를 구해줄 명령어가 git stash입니다! 😊
git stash, 도대체 왜 필요한가요? 🤔
git stash는 간단히 말해 **"아직 커밋하고 싶지 않은 변경 사항을 잠시 숨겨두는 임시 저장소"**입니다. Git은 현재 브랜치의 작업이 완료(커밋)되지 않은 상태에서 다른 브랜치로 이동하는 것을 허용하지 않을 때가 많습니다. 작업 내용이 섞일 수 있기 때문이죠.
git stash를 사용하면, 현재 작업 중이던 모든 변경 사항(Tracked files)을 '스태시'라는 별도의 공간에 안전하게 보관하고, 내 작업 공간(Working Directory)은 마지막 커밋 상태(HEAD)로 깨끗하게 되돌립니다.
이렇게 깨끗해진 상태에서 다른 브랜치로 자유롭게 이동해 급한 작업을 처리하고, 다시 원래 브랜치로 돌아와 stash에 숨겨뒀던 작업을 꺼내오면 됩니다!
git stash는 '스택(Stack)' 구조로 작동합니다. 즉, 가장 마지막에 저장한(push) 작업이 가장 먼저 꺼내지는(pop) '후입선출(LIFO)' 방식입니다.
git stash 핵심 명령어 총정리 📊
git stash는 몇 가지 간단한 명령어로 모든 작업을 처리할 수 있습니다. 가장 자주 쓰이는 명령어들을 표로 정리해 봤습니다.
Stash 핵심 명령어
| 명령어 | 설명 |
|---|---|
git stashgit stash save "메시지" |
현재 변경 사항을 임시 저장합니다. (save는 stash의 기본 동작이며, 식별을 위한 메시지를 남기는 것이 좋습니다.) |
git stash list |
저장된 스태시 목록을 보여줍니다. (예: stash@{0}, stash@{1}) |
git stash pop |
가장 최근의 스태시를 적용하고, 목록에서 삭제합니다. (가장 많이 씀) |
git stash apply |
가장 최근의 스태시를 적용하지만, 목록에서 삭제하지 않습니다. |
git stash drop |
가장 최근의 스태시를 목록에서 삭제합니다. (apply 후 수동 삭제 시 사용) |
git stash clear |
모든 스태시를 목록에서 삭제합니다. (주의해서 사용!) |
실전 예시: 급한 버그 수정 시나리오 📚
백문이 불여일견이죠. 가장 흔한 시나리오를 통해 git stash 사용 흐름을 살펴보겠습니다.
상황: 'feature/login' 브랜치 작업 중 'main' 브랜치 핫픽스 요청!
feature/login 브랜치에서 로그인 기능 파일(login.js)을 한창 수정 중입니다. (아직 커밋 전)
해결 과정
-
작업 임시 저장:
$ git stash save "로그인 기능 작업 중"(이제
feature/login브랜치는 깨끗한 상태가 됩니다.) -
메인 브랜치로 이동 및 핫픽스:
$ git switch main
$ git pull origin main
... (긴급 버그 수정) ...
$ git commit -am "긴급 버그 수정 완료"
$ git push origin main -
원래 작업 브랜치로 복귀:
$ git switch feature/login -
숨겨뒀던 작업 불러오기:
$ git stash pop(수정 중이던
login.js파일의 변경 사항이 다시 나타납니다! 스태시 목록에선 자동 삭제됩니다.)
더 유용하게 쓰기: 추가 옵션 팁 👩💼👨💻
git stash의 기본 기능만으로도 훌륭하지만, 몇 가지 옵션을 알면 훨씬 강력하게 사용할 수 있습니다.
-
git stash -u(또는--include-untracked)
기본적으로stash는 Git이 추적 중인(Tracked) 파일의 변경 사항만 저장합니다. 새로 만든 파일(Untracked)까지 함께 저장하려면-u옵션을 사용해야 합니다. -
git stash apply stash@{1}
pop이나apply는 기본적으로stash@{0}(가장 최신)을 가져옵니다.git stash list로 확인 후, 특정 번호의 스태시를 골라서 적용할 수 있습니다. -
git stash show -p stash@{0}
스태시를 적용하기 전에 어떤 내용이 저장되어 있는지 궁금할 때가 있습니다.show -p옵션은 해당 스태시의 상세 변경 내용(diff)을 보여줍니다.
pop vs applygit stash pop은 '적용 + 삭제'입니다. 만약 pop을 하다가 충돌(Conflict)이 발생하면, 스태시가 목록에서 삭제되지 않을 수 있습니다. 충돌을 해결한 후 git stash drop으로 수동 삭제해 주는 것이 좋습니다.안전하게 하려면
apply로 먼저 적용해보고, 충돌 해결 및 확인 후 drop으로 삭제하는 방법도 있습니다.
마무리: 핵심 요약 📝
git stash는 복잡한 브랜치 전략 속에서 개발자의 실수를 줄여주고 작업 효율을 극적으로 높여주는 필수 명령어입니다.
git stash 핵심 요약
git stash save "메시지"로 저장, git stash list로 목록 확인.
git stash pop (가장 최신 스태시 적용 및 목록에서 삭제).
git stash apply (적용만 하고 삭제 안 함). -u 옵션으로 새 파일도 포함 가능.
자주 묻는 질문 ❓
git stash pop과 git stash apply의 차이점이 뭔가요?pop은 스태시를 적용한 후 목록에서 **삭제**합니다. 반면 apply는 스태시를 적용하지만 목록에 **그대로 남겨둡니다.** (나중에 git stash drop으로 수동 삭제 필요)stash에 저장되나요?git stash 명령어는 Git이 이미 추적하고 있는 파일의 변경 사항만 저장합니다. 새로 만든 파일까지 저장하려면 git stash -u 또는 git stash --include-untracked 옵션을 사용해야 합니다.git stash pop을 했는데 충돌(Conflict)이 났어요!pop 실행 시 충돌이 발생하면, Git은 스태시를 목록에서 삭제하지 않고 남겨둡니다. 당황하지 마시고, 일반적인 충돌 해결(merge conflict)과 동일하게 코드를 수정한 후 git add, git commit을 진행하세요. 작업이 완료된 후 git stash drop 명령어로 해당 스태시를 수동으로 삭제해 주면 됩니다.stash는 스택(Stack) 구조라서 여러 개를 쌓아둘 수 있습니다. git stash를 실행할 때마다 stash@{0}, stash@{1}... 순서로 쌓입니다. git stash save "메시지"로 구별하기 쉬운 메시지를 남기는 것이 좋습니다.git stash list로 원하는 스태시의 번호(예: stash@{2})를 확인한 후, git stash apply stash@{2} 또는 git stash pop stash@{2}처럼 번호를 명시하여 적용할 수 있습니다.
댓글
댓글 쓰기