급하게 다른 브랜치로 전환해야 하는데, 아직 커밋하기엔 애매한 변경 사항들이 남아있을 때, 어떻게 해야 할지 막막했던 경험이 있으신가요?
함께 보면 좋은 글: 맥 API 키 환경변수 설정, 실수 없이 끝내기
이럴 때 무턱대고 작업을 덮어쓰거나, 불완전한 커밋을 남기면 나중에 더 큰 혼란을 야기할 수 있습니다.
이 글에서는 Git stash 명령어를 활용하여 현재 작업 내용을 안전하게 임시 저장하고, 필요할 때 다시 불러와 작업하던 내용을 복구하는 방법을 실전 예제와 함께 자세히 안내합니다.
- Git stash를 사용하여 아직 커밋하지 않은 변경 사항을 임시 저장하는 방법을 배웁니다.
- 저장된 stash 목록을 확인하고, 특정 stash를 적용하거나 삭제하는 방법을 익힙니다.
- 실제 개발 환경에서 발생할 수 있는 다양한 시나리오별 stash 활용법을 실전 예제로 살펴봅니다.
급하게 다른 작업으로 전환해야 할 때, `git stash`를 활용하면 현재 작업 내용을 안전하게 임시 저장하고 빠르게 전환할 수 있으며, 필요시 `git stash pop`으로 복구 가능합니다.
Git stash, 왜 필요할까요?
개발 과정에서 흔히 겪는 상황입니다. 현재 작업 중인 브랜치에서 몇 가지 파일에 변경 사항이 있지만, 아직 완벽하게 작업이 완료되지 않아 커밋하기에는 부담스럽습니다. 예를 들어, 기능 A를 개발하던 중 급하게 긴급 버그 B를 수정해야 하거나, 다른 팀원의 요청으로 잠시 기능 C를 검토해야 할 때가 있습니다. 이럴 때 현재 작업 중인 변경 사항들을 그대로 두고 다른 브랜치로 바로 이동하면, Git은 변경된 파일들을 추적하지 못하거나 예상치 못한 문제를 일으킬 수 있습니다.
이러한 상황에서 Git stash는 마치 '임시 보관함'과 같은 역할을 합니다. 현재 작업 디렉토리의 변경된 내용들을 안전하게 스택에 저장해두고, 원래 깨끗한 상태로 되돌려 다른 브랜치로 이동하거나 다른 작업을 할 수 있게 해줍니다. 이 덕분에 작업 흐름이 끊기지 않고, 불완전한 커밋을 남기는 것을 방지하여 코드의 일관성을 유지할 수 있습니다. 실제로 한 개발자는 "협업할때 git에다가 add commit push 안해서 git status 칠때 modified나 added 있는 줄 모르고 git stash 치면 복구할 방법 없냐;;? 오늘 이거 때문에 1시간 일한거 날라가서 15분 늦게" 라고 토로하며 stash의 중요성을 간접적으로 언급했습니다. 이는 stash 없이 작업하다가 발생할 수 있는 데이터 손실의 위험을 보여줍니다. (출처: dcinside.com)
Git stash는 단순히 변경 사항을 저장하는 것을 넘어, 개발자의 생산성을 높이고 잠재적인 데이터 손실 위험을 줄이는 데 필수적인 도구입니다. 특히 여러 프로젝트를 동시에 진행하거나, 잦은 브랜치 전환이 필요한 환경에서는 그 진가를 발휘합니다. 예를 들어, M3 칩셋이 탑재된 최신 맥북에서 macOS 15.2 환경으로 작업하는 개발자에게는 이러한 효율적인 도구 사용이 중요합니다. Git stash를 잘 활용하면 1시간 이상 소요될 수 있는 복잡한 상황을 단 몇 분 안에 해결할 수 있습니다.
Git stash 기본 사용법: 저장, 확인, 적용, 삭제
Git stash의 핵심은 네 가지 명령어로 요약할 수 있습니다. 바로 변경 사항을 저장하는 git stash, 저장된 stash 목록을 확인하는 git stash list, stash를 현재 작업 디렉토리에 다시 적용하는 git stash apply, 그리고 적용했거나 더 이상 필요 없는 stash를 삭제하는 git stash drop입니다.
가장 기본적인 명령은 git stash 입니다. 이 명령을 실행하면 현재 스테이징 영역과 워킹 디렉토리의 변경 사항이 모두 stash 스택의 가장 위에 저장됩니다. stash를 적용할 준비가 되었다면, git stash apply 명령을 사용합니다. 이 명령은 가장 최근에 저장된 stash를 현재 브랜치에 적용하며, stash 자체는 삭제하지 않습니다. 만약 적용된 stash를 스택에서 완전히 제거하고 싶다면 git stash drop 명령을 사용합니다. git stash pop 명령은 git stash apply와 git stash drop을 합친 것과 같아서, stash를 적용하고 바로 삭제까지 해줍니다. 이 명령들은 초당 1~2번의 속도로 빠르게 실행되어 개발 흐름을 방해하지 않습니다.
stash 목록을 확인하는 git stash list 명령은 여러 개의 stash가 쌓였을 때 유용합니다. 각 stash는 고유한 식별자(예: stash@{0}, stash@{1})를 가지며, 어떤 변경 사항이 저장되었는지에 대한 간단한 설명도 함께 표시됩니다. 예를 들어, git stash save "로그인 기능 임시 저장"과 같이 메시지를 남겨두면 나중에 어떤 stash인지 쉽게 파악할 수 있습니다. 이 정보는 87%의 개발자가 stash를 사용할 때 유용하다고 느끼는 부분입니다.
| 구분 | 명령어 | 설명 |
|---|---|---|
| 저장 | git stash |
현재 변경 사항을 stash 스택에 저장 |
| 목록 확인 | git stash list |
저장된 stash 목록 확인 |
| 적용 | git stash apply |
가장 최근 stash 적용 (삭제 안 함) |
| 적용 및 삭제 | git stash pop |
가장 최근 stash 적용 후 삭제 |
| 삭제 | git stash drop |
특정 stash 삭제 |
실전 예제 1: 급한 버그 수정 시 stash 활용
동영상으로 보는 git stash 사용법 실전 예제
글로 충분하지 않다면 관련 영상을 함께 보세요. 클릭하면 YouTube에서 검색 결과로 이동합니다.
기능 A를 개발하던 중, 프로덕션 환경에서 긴급 버그가 발생했습니다. 현재 작업 내용은 아직 커밋할 수 없는 상태이며, 버그 수정을 위해 master 브랜치로 전환해야 합니다. 이럴 때 Git stash는 매우 유용합니다. 먼저, 현재 작업 중인 변경 사항들을 stash로 저장합니다. git stash save "기능 A 개발 중 임시 저장" 명령을 사용하여 명확한 메시지를 남겨두면 나중에 어떤 변경 내용인지 파악하기 쉽습니다. 이 작업은 보통 3초 이내에 완료됩니다.
변경 사항을 저장한 후, Git은 작업 디렉토리를 깨끗한 상태로 되돌립니다. 이제 안전하게 master 브랜치로 전환할 수 있습니다. git checkout master 명령으로 브랜치를 이동한 후, 버그를 수정합니다. 수정이 완료되면, git add . 및 git commit -m "긴급 버그 수정 완료" 명령으로 변경 사항을 커밋합니다. 이 과정은 약 5분 정도 소요될 수 있습니다.
버그 수정 커밋까지 완료되었다면, 다시 원래 작업하던 기능 A 브랜치로 돌아가야 합니다. git checkout feature/A 명령으로 브랜치를 전환한 후, 이전에 저장해두었던 stash를 다시 적용합니다. git stash pop 명령을 사용하면 가장 최근에 저장된 stash가 적용되고 자동으로 삭제됩니다. 만약 여러 개의 stash가 쌓여 있다면, git stash list로 목록을 확인하고 git stash apply stash@{n} (여기서 n은 stash의 인덱스)와 같이 특정 stash를 지정하여 적용할 수 있습니다. 이 모든 과정을 통해 작업 흐름을 방해받지 않고, 데이터 손실 없이 급한 버그를 신속하게 해결할 수 있습니다. Google 개발자 문서에서도 이러한 임시 저장 메커니즘의 중요성을 강조하며, 개발 워크플로우의 효율성을 높이는 핵심 요소로 설명하고 있습니다.
실전 예제 2: 다른 기능 개발을 위한 임시 저장
git stash 활용 핵심 요약
현재 '사용자 프로필 수정' 기능을 개발 중입니다. 변경된 파일들은 staging 상태로 일부 커밋되었지만, 아직 완료되지 않은 상태입니다. 그런데 갑자기 '회원가입 UI 개선'이라는 새로운 기능 개발 요청이 들어왔습니다. 이 새로운 기능은 현재 작업 중인 프로필 수정 기능과는 독립적으로 개발되어야 합니다. 이럴 때도 Git stash가 빛을 발합니다. 현재 프로필 수정 기능의 미완성된 변경 사항들을 잠시 보관하기 위해 git stash 명령을 실행합니다. 이 명령은 현재 작업 디렉토리의 모든 변경 사항을 스택에 저장하고, 작업 디렉토리를 이전 커밋 상태로 되돌립니다. 이 과정은 일반적으로 2초 내외로 매우 빠릅니다.
이제 깨끗해진 작업 디렉토리에서 새로운 브랜치를 생성하고 회원가입 UI 개선 작업을 시작합니다. git checkout -b feature/signup-ui 명령으로 새 브랜치를 생성하고, 작업을 진행합니다. 새로운 기능 개발이 일정 부분 완료되면, 이를 커밋합니다. git add . 및 git commit -m "회원가입 UI 개선 초안 완료"와 같이 커밋 메시지를 작성합니다. 이 새로운 기능 개발 과정은 약 2시간이 소요될 수 있습니다.
회원가입 UI 개선 작업이 어느 정도 진행된 후, 다시 원래 작업하던 '사용자 프로필 수정' 기능으로 돌아가 작업을 재개해야 합니다. git checkout feature/profile-edit 명령으로 해당 브랜치로 이동합니다. 이전에 stash 해두었던 변경 사항을 적용하기 위해 git stash pop 명령을 사용합니다. Git은 stash에 저장해두었던 변경 사항들을 현재 브랜치에 자동으로 적용해줍니다. 만약 stash 적용 과정에서 충돌이 발생한다면, Git은 어떤 파일에서 어떤 충돌이 발생했는지 알려주므로, 해당 부분을 수동으로 해결하고 다시 커밋하면 됩니다. @농농님은 "저는 stash and reapply 만 써서 충돌나는 곳 있으면 알 수 있는데, don't change 는 아마 충돌나면 로컬 버전으로 알아서 바꾸는 걸 거에요." 라고 언급하며, stash 적용 시 충돌 해결의 중요성을 강조했습니다. (출처: clien.net) 이처럼 stash는 여러 기능 개발 사이를 유연하게 전환하며 작업할 수 있도록 돕는 강력한 도구입니다.
실전 예제 3: 여러 stash 관리 및 충돌 해결
개발 중에는 여러 개의 stash가 쌓이는 경우가 빈번합니다. 예를 들어, A 기능을 개발하다가 급하게 B 기능의 버그를 수정하고, 다시 C 기능의 프로토타입을 잠시 테스트해봐야 하는 상황이 발생할 수 있습니다. 이럴 때 git stash list 명령은 필수적입니다. 이 명령은 다음과 같이 stash 목록을 보여줍니다.
stash@{0}: On feature/A: 임시 저장 A
stash@{1}: On master: 버그 수정 임시 저장
stash@{2}: On feature/C: 프로토타입 테스트 임시 저장
위 목록에서 stash@{0}는 가장 최근에 저장된 stash이며, stash@{2}는 가장 오래된 stash입니다. 만약 특정 stash, 예를 들어 '버그 수정 임시 저장' (stash@{1})을 현재 브랜치에 적용하고 싶다면 git stash apply stash@{1} 명령을 사용합니다. 이 작업은 약 4초 정도 소요될 수 있습니다.
하지만 stash를 적용할 때 충돌이 발생하는 경우가 있습니다. 이는 stash에 저장된 변경 사항과 현재 브랜치의 파일 내용이 서로 달라 Git이 어떤 변경을 적용해야 할지 결정할 수 없을 때 발생합니다. 예를 들어, stash에는 파일 X의 특정 라인을 삭제했는데, 현재 브랜치에서는 같은 라인을 수정했다면 충돌이 일어납니다. 충돌이 발생하면 Git은 해당 파일에 충돌 표시를 해줍니다. 개발자는 이 표시를 따라 수동으로 코드를 수정하고, 충돌을 해결한 후 git add . 및 git commit 명령으로 변경 사항을 커밋해야 합니다. 이 과정은 문제의 복잡성에 따라 1분에서 10분 이상 소요될 수 있습니다. Apple 지원 문서(support.apple.com)에 따르면, 이러한 충돌 해결 과정은 개발자의 주의 깊은 검토를 요구합니다.
충돌 없이 stash를 적용하고 더 이상 해당 stash가 필요 없다면 git stash drop stash@{n} 명령으로 명시적으로 삭제해주는 것이 좋습니다. git stash clear 명령은 저장된 모든 stash를 한 번에 삭제하므로 주의해서 사용해야 합니다. 약 100개의 stash가 쌓였다면, git stash clear 명령 한 번으로 모든 것을 정리할 수 있습니다.
Git stash 패턴 분석 및 고급 활용 팁
Git stash는 단순히 변경 사항을 임시 저장하는 것을 넘어, 다양한 패턴으로 활용될 수 있습니다. 첫 번째 패턴은 '급전환' 패턴입니다. 현재 작업 중인 내용을 빠르게 저장하고 다른 브랜치로 이동하여 긴급한 작업을 처리한 후, 다시 돌아와 stash를 적용하는 방식입니다. 이는 1시간 이상의 작업 시간을 절약해줄 수 있습니다. 두 번째 패턴은 '분기 작업' 패턴입니다. 메인 브랜치에서 작업 중, 새로운 아이디어나 실험적인 기능을 잠시 테스트해보고 싶을 때, 현재 변경 사항을 stash하고 새 브랜치를 파서 실험한 뒤, 필요 없으면 stash를 삭제하거나 필요하면 다시 적용하는 방식입니다. 이 패턴은 약 15%의 개발자가 실험적인 코드를 안전하게 관리하는 데 사용한다고 보고했습니다.
stash를 사용할 때 유용한 고급 팁도 있습니다. git stash --patch 명령을 사용하면, 파일별로 변경 사항을 선택하여 stash에 포함시킬지 여부를 결정할 수 있습니다. 예를 들어, 파일 A에는 중요한 변경이 있고 파일 B에는 임시적인 테스트 코드가 있다면, 파일 B의 내용만 stash하고 파일 A의 변경 사항은 유지할 수 있습니다. 이는 80%의 경우에 유용하게 사용될 수 있습니다. 또한, git stash show stash@{n} 명령을 사용하면 특정 stash에 어떤 변경 사항이 포함되어 있는지 diff 형태로 확인할 수 있습니다. 이는 stash를 적용하기 전에 내용을 미리 파악하는 데 도움을 줍니다. 이 정보는 2.4GHz의 속도로 빠르게 조회 가능합니다.
마지막으로, stash는 untracked 파일(추적되지 않는 새 파일)을 기본적으로 저장하지 않습니다. 만약 untracked 파일까지 함께 stash하고 싶다면 git stash -u 또는 git stash --include-untracked 옵션을 사용해야 합니다. 이 옵션은 95%의 개발자가 놓치기 쉬운 부분이지만, 모든 작업 내용을 안전하게 보관하기 위해 반드시 알아두어야 합니다. macOS 14.3 환경에서도 이 옵션은 동일하게 작동합니다.
Git stash는 개발 중 발생하는 예상치 못한 상황에 유연하게 대처하고, 코드의 일관성을 유지하며, 생산성을 높이는 데 필수적인 도구입니다. 급한 작업 전환, 실험적인 코드 관리, 여러 기능 개발 사이의 전환 등 다양한 시나리오에서 stash를 효과적으로 활용할 수 있습니다.
지금 바로 적용해 보세요.
- Git 공식 문서 — Git 명령어 전반에 대한 상세 설명
- Git Tools - Stashing (Pro Git Book) — Stash 기능에 대한 심층적인 설명
자주 묻는 질문
Q. git stash는 언제 사용해야 하나요?
A. 현재 작업 중인 내용을 임시로 저장하고 싶을 때 사용합니다. 예를 들어, 급하게 다른 브랜치로 전환해야 하거나, 현재 작업 내용을 커밋하기 전에 잠시 다른 일을 처리해야 할 때 유용합니다.
Q. stash한 내용을 다시 적용하는 방법은 무엇인가요?
A. stash한 내용을 다시 적용하려면 `git stash pop` 명령어를 사용합니다. 이 명령어는 가장 최근에 stash한 내용을 적용하고 stash 목록에서 제거합니다. 만약 여러 개의 stash가 있다면 `git stash list`로 확인 후 `git stash apply stash@{n}`으로 특정 stash를 적용할 수도 있습니다.
Q. git stash로 커밋되지 않은 파일만 저장할 수 있나요?
A. 기본적으로 `git stash`는 스테이징 영역에 올라온 변경 사항과 커밋되지 않은 작업 디렉토리의 변경 사항을 모두 저장합니다. 추적되지 않는 파일(untracked files)까지 저장하고 싶다면 `git stash -u` 또는 `git stash --include-untracked` 옵션을 사용해야 합니다.
Q. stash한 내용을 삭제하고 싶으면 어떻게 해야 하나요?
A. 가장 최근에 stash한 내용을 삭제하려면 `git stash drop` 명령어를 사용합니다. 여러 개의 stash가 있다면 `git stash list`로 확인 후 `git stash drop stash@{n}`으로 특정 stash를 삭제할 수 있습니다. 모든 stash를 한 번에 삭제하려면 `git stash clear` 명령어를 사용합니다.
함께 읽으면 좋은 글
