
1. Git stash란 무엇인가? (작업 흐름을 끊지 않는 마법)
개발을 하다 보면 계획했던 작업 흐름이 예상치 못한 방향으로 튀어 나가는 경험을 누구나 한 번쯤 하게 됩니다. 예를 들어, 한창 새로운 기능을 구현하느라 코드를 잔뜩 수정해 놓았는데, 갑자기 운영 서버에 긴급한 버그가 발생했다는 연락을 받는 상황이죠.
이때 우리는 당황하게 됩니다. 지금 작업 중인 코드는 아직 완성되지 않아서 git commit을 하기에는 너무 지저분하고, 그렇다고 커밋을 해버리자니 아직 실행조차 안 되는 미완성 코드가 히스토리에 남는 것이 부담스럽기 때문입니다. 그렇다고 수정 중인 파일을 그대로 둔 채 다른 브랜치로 이동(git checkout)하려고 하면, Git은 “수정 사항이 있으니 커밋하거나 스태시하라”는 경고 메시지를 띄우며 이동을 막아버립니다.
이런 난처한 상황에서 우리를 구해주는 구원 투수가 바로 Git stash입니다.
Git stash는 말 그대로 현재 작업 중인 변경 사항들을 잠시 ‘스태시(stash, 숨겨두다/치워두다)’라는 별도의 공간에 안전하게 임시저장해두는 기능입니다. 마치 요리를 하다가 급한 전화가 와서 재료를 잠시 냉장고에 넣어두고 나중에 다시 꺼내 쓰는 것과 매우 흡사합니다.
Git stash를 사용하면 다음과 같은 이점을 얻을 수 있습니다.
- 깔끔한 커밋 히스토리 유지: 미완성된 코드를 억지로 커밋하지 않아도 되므로, 프로젝트의 로그가 깨끗하게 유지됩니다.
- 자유로운 브랜치 전환: 작업 중인 내용을 안전하게 보관할 수 있어, 급한 버그 수정이나 다른 브랜치의 코드를 확인하러 갈 때 걸림돌이 없습니다.
- 작업 맥락 보존: 나중에 다시 돌아왔을 때, 이전에 작업하던 상태 그대로를 즉시 복원하여 흐름을 이어갈 수 있습니다.
결국 Git stash의 핵심은 “지금 당장 정리할 수 없는 작업물을 안전한 곳에 격리해두고, 나중에 필요할 때 다시 불러오는 것”입니다. 이 기능을 제대로 익혀두면 작업의 흐름(Context Switching)을 끊기지 않고 유연하게 관리할 수 있는 숙련된 개발자로 성장할 수 있습니다.
2. [기초] Git stash 기본 명령어: 임시저장과 목록 확인
개발을 하다 보면 정말 당황스러운 순간이 있습니다. 열심히 기능을 구현하고 있는데, 갑자기 급한 버그 수정 요청이 들어오거나 다른 브랜치로 즉시 전환해야 하는 상황 말이죠. 이때 아직 커밋(Commit)하기에는 코드가 엉망이고, 그렇다고 작업 내용을 버릴 수도 없을 때 구원투수처럼 등장하는 기능이 바로 Git stash입니다.
git stash는 현재 작업 디렉토리의 변경 사항(Modified 상태의 파일들)을 별도의 안전한 공간에 잠시 ‘치워두는’ 역할을 합니다. 이를 통해 작업 중인 코드를 깨끗한 상태로 되돌려 다른 작업을 수행할 수 있습니다. 이제 가장 기본이 되는 두 가지 명령어를 실습을 통해 익혀보겠습니다.
1. 현재 작업 내용 임시저장하기 (`git stash`)
가장 먼저, 현재 수정 중인 사항을 스태시 목록에 저장하는 방법입니다. 별도의 옵션 없이 아래 명령어를 입력하면 됩니다.
# 현재 변경 사항을 스태시에 저장합니다.
git stash
# 만약 어떤 작업인지 메모를 남기고 싶다면 아래와 같이 사용합니다.
git stash save "로그인 기능 구현 중 - UI 작업 완료"
- git stash: 현재 워킹 디렉토리의 변경 사항을 스태시 스택에 저장하고, 워킹 디렉토리를 마지막 커밋 상태로 되돌립니다.
- git stash save “메시지”: 저장할 때 간단한 설명을 덧붙입니다. 나중에 목록이 많아졌을 때 어떤 작업인지 쉽게 식별할 수 있어 매우 유용합니다.
실행 결과 예시:
Saved working directory and index state WIP on main: 0a1b2c3 Fix initial layout
(위 결과는 ‘main’ 브랜치의 ‘0a1b2c3’ 커밋 상태를 기준으로 작업 내용이 저장되었다는 뜻입니다.)
2. 저장된 목록 확인하기 (`git stash list`)
스태시에 작업 내용을 잘 넣어두었다면, 나중에 다시 꺼내 쓰기 전에 내가 무엇을 저장했는지 확인해야 합니다. 이때 사용하는 명령어가 list입니다.
# 저장된 모든 스태시 목록을 확인합니다.
git stash list
- git stash list: 스태시 스택에 쌓여 있는 작업 목록을 번호(index)와 함께 보여줍니다.
실행 결과 예시:
stash@{0}: On main: 로그인 기능 구현 중 - UI 작업 완료
stash@{1}: On feature/api: API 연동 로직 수정 중
(여기서 `stash@{0}`은 가장 최근에 저장한 작업을 의미하며, 숫자가 커질수록 오래전에 저장된 작업입니다.)
💡 실무자 팁: 메시지를 꼭 남기세요! 초보 개발자분들은 단순히 git stash만 입력하는 경우가 많습니다. 하지만 프로젝트 규모가 커지고 작업이 쌓이다 보면, stash@{2}가 정확히 어떤 기능을 만들다 멈춘 코드인지 기억하기가 매우 어렵습니다. 나중에 고생하지 않으려면 git stash save “메시지”를 습관화하여, 마치 커밋 메시지를 쓰듯 작업 내용을 기록해두는 것이 좋습니다. 이렇게 하면 나중에 복원할 때 훨씬 빠르고 정확하게 작업을 이어갈 수 있습니다.
3. [심화] Git stash 복원하기: pop vs apply 차이점 완벽 정리
git stash를 통해 소중한 작업 내용을 안전하게 임시저장했다면, 이제는 필요한 시점에 다시 꺼내 쓰는 기술이 필요합니다. 많은 초보 개발자가 단순히 git stash pop만 사용하곤 하지만, 실무에서는 작업의 안전성을 위해 apply와 pop의 차이를 명확히 알고 구분해서 사용해야 합니다. 이 두 명령어의 결정적인 차이는 ‘복원 후 스태시 목록에서 해당 내역을 삭제하느냐, 유지하느냐’에 있습니다.
1. git stash pop: 꺼내면서 동시에 삭제하기 pop은 스태시 스택의 가장 최상단(가장 최근)에 있는 작업을 가져와 현재 작업 디렉토리에 적용한 뒤, 스태시 목록에서 해당 데이터를 즉시 삭제합니다. 마치 서랍에서 물건을 꺼내면서 동시에 서랍 안의 목록에서도 지워버리는 것과 같습니다.
- 언제 사용하나요?
- 임시저장했던 작업이 더 이상 필요 없고, 깔끔하게 작업 흐름을 이어가고 싶을 때 사용합니다.
- 코드 예제 및 실행 결과
# 1. 가장 최근의 stash를 적용하고 목록에서 삭제
git stash pop
# 2. 결과 확인
git stash list
- git stash pop: 가장 최근에 저장된 변경 사항을 현재 브랜치로 가져오고, 스태시 목록에서 제거합니다.
- git stash list: 현재 남아있는 스태시 목록을 확인합니다.
- 실행 결과:
# (pop 실행 후)
# M index.html (변경 사항이 적용됨)
$ git stash list
(목록이 비어있거나, pop한 항목이 사라져 있음)
2. git stash apply: 꺼내기만 하고 목록은 유지하기 apply는 스태시 스택에 저장된 내용을 현재 작업 디렉토리에 적용하지만, 스태시 목록에는 해당 내역을 그대로 남겨둡니다. 즉, 서랍에서 물건을 꺼내서 사용은 하되, 만약의 사태를 대비해 서랍 안에 똑같은 물건을 그대로 두는 방식입니다.
- 언제 사용하나요?
- 동일한 변경 사항을 여러 브랜치에 중복해서 적용해야 할 때 매우 유용합니다.
- pop을 했다가 코드 충돌(Conflict)이 발생하여 작업 내용이 꼬일까 봐 불안할 때, 안전하게 apply로 먼저 적용해 보는 용도로 사용합니다.
- 코드 예제 및 실행 결과
# 1. 특정 인덱스(예: stash@{0})의 내용을 적용만 하기
git stash apply stash@{0}
# 2. 결과 확인
git stash list
- git stash apply stash@{0}: stash@{0}에 저장된 내용을 적용하지만, 목록에는 여전히 남아있습니다.
- git stash list: 적용 후에도 목록에 해당 내역이 그대로 존재합니다.
- 실행 결과:
# (apply 실행 후)
# M index.html (변경 사항이 적용됨)
$ git stash list
stash@{0}: WIP on main: ... (내용이 그대로 남아있음)
💡 실무 활용 꿀팁: “안전 제일주의” 협업 중이거나 복잡한 머지(Merge) 상황에 직면했다면, 저는 개인적으로 pop보다는 apply를 먼저 사용하는 것을 권장합니다. pop을 사용했는데 예상치 못한 충돌이 발생하면, 스태시 목록에서 데이터가 사라진 상태로 충돌을 해결해야 하므로 심리적 압박이 크고 복구가 까다로울 수 있기 때문입니다.
먼저 git stash apply로 코드를 안전하게 불러온 뒤, 작업이 완벽하게 성공하고 충돌이 해결된 것을 확인했을 때 비로소 git stash drop 명령어를 통해 수동으로 해당 내역을 삭제하는 습관을 들이면 훨씬 안전한 Git 워크플로우를 구축할 수 있습니다.
4. [응용] 이름 지정 저장과 특정 스태시 선택해서 가져오기
git stash를 단순히 사용하다 보면 어느 순간 당황스러운 상황에 직면하게 됩니다. “아까 저장해둔 코드가 뭐였지?”라며 스태시 목록을 하나씩 뒤져봐야 하는 상황이죠. 스태시가 쌓일수록 단순히 git stash만 입력하는 방식은 마치 이름표 없는 상자를 쌓아두는 것과 같습니다. 이때 필요한 것이 바로 이름 지정 저장과 특정 스태시를 골라내는 기술입니다.
1. 이름표를 붙여서 저장하기: `push -m`
과거에는 git stash save “메시지” 명령어를 사용했지만, 최신 Git 버전에서는 git stash push -m “메시지” 사용을 권장합니다. 작업의 맥락을 메시지로 남겨두면 나중에 목록을 확인할 때 훨씬 직관적입니다.
# 1. 현재 작업 내용을 '로그인 기능 구현 중'이라는 메시지와 함께 저장
git stash push -m "login feature implementation"
# 2. 또 다른 작업을 '버그 수정 중'이라는 메시지와 함께 저장
git stash push -m "fix: validation error in signup"
# 3. 저장된 스태시 목록 확인
git stash list
- git stash push -m “메시지”: 현재 변경 사항을 지정한 메시지와 함께 스태시 목록에 추가합니다.
- git stash list: 현재 저장된 모든 스태시 목록을 인덱스 번호와 메시지 함께 보여줍니다.
[실행 결과 예시]
stash@{0}: On main: fix: validation error in signup
stash@{1}: On main: login feature implementation
위 결과를 보면 stash@{0}이 가장 최근에 저장된 것이며, 메시지를 통해 어떤 작업이었는지 바로 알 수 있습니다.
2. 원하는 시점의 코드만 쏙 골라오기: `apply`와 인덱스
스태시가 여러 개일 때 git stash pop을 무심코 사용하면 가장 최근의 작업만 복구됩니다. 만약 며칠 전에 저장해둔 특정 작업을 가져오고 싶다면, git stash list로 확인한 인덱스 번호(`stash@{n}`)를 사용해야 합니다.
# 1. 특정 인덱스의 스태시 내용을 적용 (목록에서 stash@{1}을 확인했다고 가정)
git stash apply stash@{1}
# 2. 적용과 동시에 스태시 목록에서 삭제하고 싶을 때
git stash pop stash@{1}
- git stash apply stash@{n}: stash@{n}에 저장된 변경 사항을 현재 작업 디렉토리에 적용합니다. (스태시 목록에는 그대로 남아있습니다.)
- git stash pop stash@{n}: stash@{n}의 내용을 적용함과 동시에 스태시 목록에서 해당 항목을 삭제합니다.
💡 개발자 꿀팁: `apply`를 먼저 사용하세요! 저는 개인적으로 pop보다 apply를 먼저 사용하는 것을 추천합니다. pop은 적용과 삭제가 동시에 일어나기 때문에, 만약 코드 충돌(Conflict)이 발생하면 스태시 목록에서 해당 항목이 지워지지 않은 채로 남아있어 혼란을 줄 수 있기 때문입니다. 먼저 apply로 코드를 안전하게 가져와 충돌을 해결한 뒤, 문제가 없다면 git stash drop stash@{n}으로 수동 삭제하는 것이 훨씬 안전한 워크플로우입니다.
5. [실전] Git stash 관리 및 삭제: 깔끔한 워크플로우 만들기
git stash를 활용해 작업을 임시 저장하다 보면, 어느덧 스태시 목록이 쌓여 무엇이 중요한 작업이었는지 헷갈리는 상황이 발생하곤 합니다. 마치 책상 위에 정리하지 않은 포스트잇이 수북이 쌓여 있는 것과 같죠. 이렇게 방치된 스태시 데이터는 나중에 실수로 엉뚱한 코드를 복원하게 만들거나, 작업 흐름을 방해하는 원인이 됩니다. 따라서 효율적인 Git stash 사용법의 핵심은 단순히 저장하는 것을 넘어, 필요 없는 데이터를 적시에 정리하는 ‘청소’ 과정에 있습니다.
불필요해진 임시 저장 데이터를 정리하는 방법은 크게 두 가지로 나뉩니다. 특정 항목만 골라 삭제하거나, 모든 데이터를 한 번에 비우는 방법입니다.
1. 특정 스태시 항목만 골라서 삭제하기
가장 권장하는 방법은 git stash pop이나 git stash apply를 통해 작업을 복원한 직후, 해당 스태시를 즉시 삭제하는 것입니다. 하지만 이미 복원했음에도 목록에 남아있거나, 아예 필요 없어진 데이터라면 drop 명령어를 사용해야 합니다.
# 1. 현재 저장된 스태시 목록 확인
git stash list
# 2. 특정 인덱스의 스태시 삭제 (예: 가장 최근 항목 삭제)
git stash drop stash@{0}
- git stash list: 현재 스태시 저장소에 쌓여 있는 목록을 번호(index)와 함께 보여줍니다.
- git stash drop stash@{0}: 목록 중 가장 위에 있는(가장 최근의) stash@{0} 항목을 삭제합니다.
실행 결과 예시:
$ git stash list
stash@{0}: WIP on feature/login: 8a2b3c4 fix login bug
stash@{1}: WIP on develop: 1f2e3d4 update readme
$ git stash drop stash@{0}
Dropped refs/stash@{0} (8a2b3c4...)
$ git stash list
stash@{1}: WIP on develop: 1f2e3d4 update readme
2. 모든 스태시 데이터 한 번에 비우기
프로젝트의 브랜치를 완전히 새로 설정하거나, 그동안 쌓인 임시 저장 데이터가 모두 쓸모없어졌다고 판단될 때는 하나씩 지울 필요 없이 한 번에 정리할 수 있습니다.
# 모든 스태시 목록을 한 번에 삭제
git stash clear
- git stash clear: 스태시 저장소에 있는 모든 데이터를 즉시 삭제합니다. 주의: 이 명령은 복구가 매우 어려우므로 신중하게 사용해야 합니다.
실행 결과 예시:
$ git stash clear
$ git stash list
(결과값이 출력되지 않음 - 모든 스태시가 삭제됨)
💡 개발자 팁: 깔끔한 워크플로우를 위한 습관
실무에서는 git stash를 남발하기보다, ‘작업 단위’를 명확히 하는 것이 중요합니다. 스태시를 생성할 때 git stash save “메모” 또는 git stash push -m “메모”를 사용하여 이름을 붙여두면, 나중에 drop을 할 때 어떤 것을 지워야 할지 고민하는 시간을 획기적으로 줄일 수 있습니다.
작업이 끝나면 반드시 list로 확인하고, pop으로 복원함과 동시에 목록을 정리하는 습관을 들이세요. 깨끗한 스태시 목록이 곧 깨끗한 코드 관리의 시작입니다.
6. [트러블슈팅] Git stash 사용 중 발생하는 문제와 해결책 (FAQ)
Git stash를 능숙하게 사용하게 되더라도, 실무에서는 예상치 못한 돌발 상황이 발생하곤 합니다. 단순히 코드를 치워두는 것을 넘어, 저장된 내용을 다시 불러올 때 발생하는 충돌이나 저장되지 않은 파일 문제에 당황하지 않고 대처하는 것이 진정한 숙련자의 자세입니다. 가장 자주 마주치는 세 가지 상황과 그 해결책을 정리해 드립니다.
1. stash 복원 시 발생하는 Conflict(충돌) 해결하기
가장 당혹스러운 순간은 git stash pop을 실행했을 때 “Conflict” 메시지가 뜨는 경우입니다. 이는 stash에 저장했던 코드의 변경 사항이, 현재 브랜치의 최신 코드와 같은 라인을 수정했을 때 발생합니다. 이때 Git은 stash를 자동으로 목록에서 삭제하지 않고 충돌을 해결할 때까지 유지합니다.
- 해결 순서:
- 충돌이 발생한 파일을 열어 <<<<<<< HEAD와 >>>>>>> stash@{0} 사이의 코드를 확인합니다.
- 코드를 수동으로 병합(Merge)하여 올바른 상태로 수정합니다.
- 수정이 완료되면 git add <파일명>을 통해 충돌 해결을 알립니다.
- 중요: 충돌이 해결되었다면 git stash drop을 실행하여 남아있는 stash 항목을 수동으로 삭제해야 합니다. (충돌 시에는 pop이 자동으로 삭제되지 않기 때문입니다.)
# 1. 충돌이 발생한 파일 수정 후 스테이징
git add src/main.py
# 2. 충돌 해결이 완료되었으므로 stash 목록에서 해당 항목 삭제
git stash drop
- git add src/main.py: 충돌을 해결한 파일을 스테이징 영역에 올립니다.
- git stash drop: 충돌로 인해 자동으로 삭제되지 못한 stash 항목을 목록에서 제거합니다.
실행 결과 예시:
$ git stash pop
Auto merging src/main.py
CONFLICT (content): Merge conflict in src/main.py
error: Your local changes to the following files would be overwritten by merge:
src/main.py
Please fix the conflicts and then commit the result.
2. 새로 만든 파일이 stash에 포함되지 않을 때 (`-u` 옵션)
git stash를 실행했는데, 방금 막 생성한 파일(Untracked files)이 저장되지 않고 그대로 남아있는 경우가 있습니다. Git은 기본적으로 ‘추적 중인(Tracked)’ 파일의 변경 사항만 관리하기 때문입니다. 이럴 때는 -u (또는 –include-untracked) 옵션을 반드시 사용해야 합니다.
- 해결 방법:
새로 만든 파일까지 통째로 안전하게 임시 저장하고 싶다면 아래 명령어를 사용하세요.
# 추적되지 않는 파일까지 모두 포함하여 stash
git stash -u
- git stash -u: 새로 생성된 파일(untracked)을 포함하여 현재 작업 디렉토리의 모든 변경 사항을 스태시 목록에 넣습니다.
실행 결과 예시:
$ ls # 새로 만든 config.json이 보임
config.json
$ git stash -u
Saved working directory and index state WIP on main: ...
$ ls # 이제 config.json이 사라지고 깨끗해짐
3. 실무자를 위한 한 줄 팁: stash 목록 확인의 습관화
여러 번 stash를 반복하다 보면, 내가 무엇을 저장했는지 잊어버려 엉뚱한 코드를 복원하는 실수를 할 수 있습니다. git stash pop을 하기 전에는 반드시 git stash list를 통해 저장된 목록과 메시지를 확인하는 습관을 들이세요. 만약 메시지를 남기고 싶다면 git stash save “메시지” 대신 git stash push -m “메시지”를 사용하는 것이 최신 권장 방식입니다.
7. 요약: Git stash를 활용한 효율적인 개발 습관
지금까지 우리는 작업 중인 코드를 안전하게 보관하고, 필요할 때 언제든 꺼내 쓸 수 있는 마법 같은 명령어, git stash에 대해 자세히 알아보았습니다. 갑작스러운 버그 수정 요청이나 긴급한 브랜치 전환 상황에서 당황하지 않고 작업을 이어갈 수 있는 핵심 기술을 마스터하신 것입니다.
오늘 배운 내용을 잊지 않도록 핵심 명령어들을 한눈에 보기 쉽게 정리해 드립니다.
| 상황 | 명령어 | 설명 | | :— | :— | :— | | 작업 임시저장 | git stash | 현재 변경 사항을 스택에 저장하고 워킹 디렉토리를 깨끗하게 만듭니다. | | 이름 붙여 저장 | git stash save “메시지” | 어떤 작업인지 메모를 남겨 저장합니다. (권장) | | 목록 확인 | git stash list | 저장된 stash 목록을 확인합니다. | | 최근 작업 복원 | git stash apply | 가장 최근의 stash를 적용하지만, 목록에는 남겨둡니다. | | 복원 후 삭제 | git stash pop | 가장 최근의 stash를 적용함과 동시에 목록에서 삭제합니다. | | 특정 작업 복원 | git stash apply stash@{n} | 인덱스 번호를 지정하여 원하는 시점의 작업을 가져옵니다. | | 저장된 목록 삭제 | git stash drop stash@{n} | 특정 stash 항목을 삭제합니다. | | 전체 삭제 | git stash clear | 저장된 모든 stash 목록을 비웁니다. |
💡 생산성을 높이는 Git stash 활용 꿀팁
단순히 명령어를 외우는 것을 넘어, 실무에서 git stash를 어떻게 활용하면 더 효율적일까요? 제가 직접 경험하며 느낀 몇 가지 팁을 공유합니다.
- 메시지를 반드시 남기세요 (`save` 활용): git stash만 입력하면 나중에 list를 확인했을 때 어떤 작업이었는지 알 수 없어 난감할 때가 많습니다. git stash save “로그인 UI 수정 중”과 같이 짧은 메모를 남기는 습관을 들이면, 수많은 stash 사이에서 길을 잃지 않습니다.
- `pop`보다는 `apply`를 먼저 고려하세요: pop은 복원과 동시에 삭제가 일어나기 때문에, 만약 코드 충돌(Conflict)이 발생하면 당황스러울 수 있습니다. 우선 apply로 코드를 안전하게 불러와 충돌을 해결한 뒤, 작업이 완벽하다고 판단될 때 drop으로 삭제하는 것이 훨씬 안전한 워크플로우입니다.
- 정기적인 청소는 필수입니다: 프로젝트를 진행하다 보면 사용하지 않는 오래된 stash들이 쌓여 목록이 지저분해지곤 합니다. 일주일에 한 번 정도는 git stash list를 확인하여 불필요한 데이터는 drop이나 clear로 정리해 주세요.
git stash는 단순히 코드를 숨기는 기능이 아니라, 개발자의 흐름(Flow)을 끊기지 않게 도와주는 강력한 도구입니다. 오늘 배운 내용을 바탕으로, 급한 상황에서도 여유롭게 코드를 관리하는 숙련된 개발자로 거듭나시길 바랍니다!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.