Git Stash란?
기능 개발 중에 긴급한 일이 발생하는 경우가 있습니다. 메인 branch에서 버그를 수정해야 하거나, 팀원의 pull request를 리뷰해야 할 수 있습니다. 작업 중인 코드를 commit할 준비가 되지 않았지만, commit하지 않은 변경사항이 있는 상태로는 branch를 전환할 수 없습니다. 바로 이 문제를 해결하기 위해 git stash가 만들어졌습니다.
Git stash는 commit하지 않은 변경사항(staging된 것과 그렇지 않은 것 모두)을 가져와 임시 저장 영역에 저장합니다. 작업 디렉토리는 마지막 commit과 일치하는 깨끗한 상태로 돌아갑니다. 준비가 되면 그 변경사항들을 다시 가져올 수 있습니다. 다른 일을 처리하기 위해 작업을 선반에 올려놓고, 끝나면 정확히 그 지점에서 다시 시작하는 것과 같다고 생각하세요.
기본 사용법: Stash, Apply, Pop
변경사항을 stash에 저장하기
가장 간단한 형태는:
git stash
이 명령은 추적 중인 수정된 파일과 staging된 파일을 모두 저장합니다. 작업 디렉토리는 깨끗해집니다. 추적되지 않는 파일(Git에 한 번도 추가하지 않은 파일)은 기본적으로 stash되지 않습니다. 이들을 포함하려면:
git stash -u
또는 무시된 파일까지 모두 포함하려면:
git stash -a
apply로 변경사항 복원하기
부수적인 작업을 마치고 stash한 작업을 다시 가져오려면:
git stash apply
이것은 stash된 변경사항을 작업 디렉토리에 복원하지만, stash 항목은 그대로 유지합니다. stash는 여전히 선반 위에 있으므로, 같은 변경사항을 여러 branch에 적용하고 싶을 때 유용합니다.
pop으로 변경사항 복원하기
git stash pop
pop은 apply와 같이 동작하지만, 적용 후 stash 항목도 제거합니다. 단순히 작업을 복원하고 stash를 보관할 필요가 없을 때 더 일반적인 선택입니다.
핵심 차이점: apply는 stash를 유지하고, pop은 복원 후 삭제합니다. stash를 다시 사용할 수 있는 경우 apply를, 더 이상 필요 없는 경우 pop을 사용하세요.
Stash에 메시지 추가하기
기본적으로 Git은 WIP on main: a3b4c5d commit message와 같은 자동 생성된 설명으로 stash에 레이블을 붙입니다. 여러 stash가 있을 때 이는 별로 도움이 되지 않습니다. 설명적인 메시지를 추가할 수 있습니다:
git stash push -m "refactoring the auth module"
나중에 stash 목록을 확인할 때 각 stash의 내용을 훨씬 쉽게 식별할 수 있습니다.
여러 stash 관리하기
stash 목록 보기
Git은 stash 스택을 관리합니다. 모든 stash를 확인하려면:
git stash list
출력은 다음과 같습니다:
stash@{0}: On main: refactoring the auth module
stash@{1}: WIP on feature/checkout: 9f2e1d0 add cart logic
stash@{2}: WIP on main: 7c8d9e1 update dependencies
가장 최근 stash는 항상 stash@{0}입니다. 새로운 stash가 추가될 때마다 이전 stash는 스택 아래로 밀려납니다.
특정 stash를 apply 또는 pop하기
기본적으로 apply와 pop은 가장 최근 stash에 대해 동작합니다. 특정 stash를 대상으로 하려면 인덱스로 참조합니다:
git stash apply stash@{2}
git stash pop stash@{1}
stash 내용 확인하기
stash를 적용하기 전에 내용을 확인하고 싶을 수 있습니다:
git stash show stash@{0}
변경된 파일의 요약을 보여줍니다. 전체 diff를 보려면 -p를 추가하세요:
git stash show -p stash@{0}
특정 파일만 stash하기
모든 것을 stash하고 싶지 않을 때가 있습니다. 한두 개 파일의 변경사항만 따로 보관하고 싶을 수 있습니다. Git 2.13부터 다음과 같이 할 수 있습니다:
git stash push -m "sidebar layout changes" src/components/Sidebar.tsx src/styles/sidebar.css
지정된 파일만 stash됩니다. 나머지는 모두 작업 디렉토리에 그대로 남습니다.
Stash 삭제 및 정리
단일 stash 삭제
특정 stash가 더 이상 필요 없다면 다음으로 제거합니다:
git stash drop stash@{1}
해당 stash 항목이 삭제됩니다. 나머지 stash는 자동으로 재인덱싱됩니다.
모든 stash 정리
모든 stash를 한 번에 제거하려면:
git stash clear
이 명령에 주의하세요. 되돌릴 수 없습니다. stash된 모든 변경사항이 영구적으로 삭제됩니다.
Stash에서 branch 생성하기
변경사항을 stash한 후, 해당 변경사항이 별도의 branch를 가질 만하다고 깨달을 때가 있습니다. stash를 적용한 다음 branch를 생성하는 대신, Git은 단축 명령을 제공합니다:
git stash branch new-feature-branch stash@{0}
이것은 stash가 원래 생성된 commit에서 새 branch를 만들고, stash를 적용한 후 삭제합니다. 현재 branch에 stash를 적용하면 충돌이 발생할 수 있는 경우 특히 유용합니다.
자주 하는 실수
- Stash를 잊어버림. stash는 잊어버리기 쉽습니다. 정기적으로
git stash list를 실행하여 적용하거나 삭제해야 할 남은 stash가 없는지 확인하세요. - Stash 충돌. stash한 이후 코드가 크게 변경되었다면, stash를 적용할 때 merge 충돌이 발생할 수 있습니다. 일반적인 merge 충돌과 동일한 방법으로 해결하세요.
- Commit 대신 stash에 의존. 자주 stash를 하고 있다면, 대신 작업 중인 코드를 commit하는 것을 고려하세요. 나중에 언제든지 그 commit들을 amend하거나 squash할 수 있습니다. stash는 빠르고 짧은 컨텍스트 전환에 가장 적합하며, 장기 보관에는 적합하지 않습니다.
GitSquid에서 stash 사용하기
GitSquid는 commit 그래프에 stash를 직접 표시하므로, 어떤 stash가 있고 어떤 commit에서 생성되었는지 한눈에 확인할 수 있습니다. stash를 오른쪽 클릭하면 apply, pop, drop 또는 모든 stash를 정리하는 옵션이 있는 컨텍스트 메뉴가 열립니다. 이를 통해 여러 stash를 검사하거나 정리해야 할 때 명령어를 입력하는 것보다 훨씬 빠르게 stash를 관리할 수 있습니다.
빠른 참조
| 명령어 | 동작 |
|---|---|
git stash |
추적 중인 변경사항을 stash |
git stash -u |
추적되지 않는 파일 포함하여 stash |
git stash push -m "msg" |
설명 메시지와 함께 stash |
git stash list |
모든 stash 목록 표시 |
git stash apply |
stash 복원, 항목 유지 |
git stash pop |
stash 복원, 항목 삭제 |
git stash drop stash@{n} |
특정 stash 삭제 |
git stash clear |
모든 stash 삭제 |
git stash show -p |
stash의 전체 diff 표시 |
git stash branch <name> |
stash에서 branch 생성 |
Git stash는 필요할 때까지는 사소해 보이는 도구 중 하나입니다. 익숙해지면 작업 간 컨텍스트 전환이 매끄러워집니다. 메시지로 stash를 정리하고, 오래된 stash를 정기적으로 정리하며, stash를 보관할 필요가 없을 때는 apply 대신 pop을 사용하세요.