작업 중 긴급 브랜치 변경 시 깃 스태시로 코드 임시 저장하고 충돌 없이 복구하는 완벽 가이드
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
작업 중 긴급 브랜치 변경 시 깃 스태시로 코드 임시 저장하고 충돌 없이 복구하는 완벽 가이드
📑 목차
갑작스러운 요청에도 당황하지 않는 개발자의 비밀 무기, Git Stash 완벽 가이드
안녕하세요. 15년 차 백엔드 개발자이자 기술 서적 작가로서, 오늘도 여러분과 함께 치열한 코딩의 현장을 탐구하게 되어 가슴이 뜁니다. 개발자라면 누구나 한 번쯤, 아니 하루에도 수십 번씩 겪게 되는 '식은땀 나는 상황'이 있습니다. 바로 집중해서 코드를 짜고 있는데 갑자기 치고 들어오는 긴급 요청들이죠. ☕
상상해보세요. 금요일 오후 5시, 여러분은 아주 복잡한 결제 모듈의 핵심 로직을 리팩토링 중입니다. 코드는 엉망이고, 컴파일은 안 되며, 변수명은 아직 `temp1`, `abc` 같은 임시 이름으로 가득합니다. 마치 수술실에서 환자의 배를 열어두고 장기를 이식하는 중인 외과 의사와 같은 상태죠. 그런데 갑자기 슬랙 알림이 울리고 팀장님이 달려와 외칩니다. "지금 당장 운영 서버 결제 오류 났어요! 10분 내로 핫픽스(Hotfix) 배포해야 합니다!"
이때 여러분의 머릿속은 하얗게 변합니다. '지금 작업 중인 건 어떡하지? 커밋(Commit)하기에는 쓰레기 같은 코드인데... 그렇다고 3시간 동안 짠 코드를 다 지울 수도 없고...' 이런 진퇴양난의 상황에서 우리를 구원해 줄 유일한 영웅이 있습니다. 바로 Git Stash(깃 스태시)입니다. 통계적으로 개발자의 생산성 저하 원인 중 40%가 이런 '컨텍스트 스위칭(Context Switching)' 비용에서 발생한다고 합니다. 오늘 이 글을 끝까지 읽으시면, 여러분은 브랜치 전환 앞에서 망설이거나 두려워하지 않게 될 것입니다. 제가 15년 동안 수천 번의 '커밋 지옥'과 '충돌의 늪'에서 탈출하며 깨달은 노하우를 아낌없이 풀어드리겠습니다.
1. Git Stash란 무엇인가? 단순한 임시 저장을 넘어서
📦 작업 공간의 타임머신: 3가지 영역의 이해
많은 분이 Git Stash를 단순히 '클립보드'나 '임시 저장소' 정도로만 알고 계십니다. 하지만 제가 정의하는 Stash는 '작업 공간의 상태를 그대로 얼려두는 타임머신'입니다. 이를 제대로 이해하려면 Git의 3가지 영역인 작업 디렉토리(Working Directory), 스테이징 영역(Staging Area), 그리고 저장소(Repository)의 관계를 알아야 합니다. Stash는 현재의 작업 디렉토리와 스테이징 영역의 모든 변경 사항을 스택(Stack) 구조에 보관하고, 작업 트리를 가장 최근의 커밋(HEAD) 상태로 깨끗하게 되돌리는 명령어입니다.
이게 왜 중요할까요? 단순히 파일을 복사해서 백업 폴더에 넣는 것과는 차원이 다릅니다. Git이 관리하는 파일의 인덱스(Index) 정보, 즉 파일의 추적 상태까지 함께 저장되기 때문입니다. 여러분이 어떤 파일을 수정했고, 어떤 파일을 `git add`로 스테이징에 올렸는지 그 '맥락'까지 저장한다는 뜻입니다. 마치 책을 읽다가 급한 일이 생겨서 책갈피를 꽂아두고 덮는 것과 같습니다. 나중에 다시 펼치면 정확히 읽던 페이지, 읽던 문장부터 다시 시작할 수 있죠.
🔍 내부 동작 원리: 스택(Stack)의 LIFO 구조
컴퓨터 공학을 전공하셨다면 스택(Stack) 자료구조를 아실 겁니다. LIFO(Last In, First Out), 즉 나중에 들어간 것이 먼저 나오는 구조죠. Git Stash는 철저하게 이 스택 구조를 따릅니다. 여러분이 `git stash`를 실행할 때마다 변경 사항은 차곡차곡 쌓입니다. 첫 번째 저장한 것은 바닥(`stash@{0}` -> `stash@{1}`)으로 내려가고, 방금 저장한 것이 가장 위(`stash@{0}`)에 올라옵니다.
초보 개발자들이 가장 많이 하는 실수가 여기서 발생합니다. 스택에 계속 쌓아두기만 하고 정리를 안 하는 것이죠. 실제로 제가 멘토링했던 주니어 개발자의 컴퓨터를 보면 `stash@{50}`까지 쌓여있는 경우도 봤습니다. 나중에 꺼내려고 보면 번호만 붙어 있어서 도대체 무엇을 저장했는지 알 수 없게 됩니다. 마치 냉동실에 검은 비닐봉지를 잔뜩 넣어두고 나중에 "이게 떡이었나, 생선이었나?" 고민하는 것과 똑같습니다. 이 글의 뒷부분에서 이 스택을 명확하게 관리하는 '네이밍(Naming)' 기법을 상세히 다룰 예정입니다.
💡 실전 비유: 요리사의 도마와 냉장고
저는 종종 후배들에게 Git Stash를 '요리사의 도마'에 비유합니다. 여러분이 양파를 썰고 있는데(기능 개발 중), 갑자기 셰프가 와서 "지금 당장 스테이크를 구워!"(긴급 버그 수정)라고 합니다. 이때 썰던 양파를 도마 위에 그대로 두고 스테이크를 구우면 어떻게 될까요? 양파 냄새가 스테이크에 배거나, 도마 공간이 부족해서 칼질 실수를 하게 됩니다.
Git Stash는 썰던 양파를 그릇에 담아 냉장고(스택)에 잠시 넣어두고, 도마(작업 공간)를 물로 씻어 깨끗하게 만드는 행위입니다. 도마가 깨끗해졌으니 스테이크 요리를 완벽하게 수행할 수 있죠. 요리가 끝나면? 다시 냉장고에서 아까 썰던 양파 그릇을 꺼내와서 작업을 계속하면 되는 것입니다. 아주 깔끔하고 위생적이며, 무엇보다 서로의 작업이 섞이지 않습니다.
2. 기본 사용법부터 실전 응용까지: 3단계 심화 학습
🛠️ 1단계: 가장 기초적인 저장과 'Untracked'의 함정
가장 기본적인 명령어는 `git stash`입니다. 아무 옵션 없이 이 명령어를 입력하면, 현재 Git이 추적 중인(Tracked) 파일의 변경 사항이 스택에 저장됩니다. 터미널에는 `Saved working directory and index state WIP on master...`라는 메시지가 뜹니다. 이때 코드는 가장 최근 커밋 상태로 돌아갑니다.
하지만 여기서 90%의 개발자가 겪는 함정이 있습니다. 바로 '새로 생성한 파일(Untracked Files)'은 기본적으로 저장되지 않는다는 점입니다. 제가 신입 시절, 열심히 새 클래스 파일을 만들고 스태시를 했는데, 브랜치를 바꾸니 그 파일들이 덩그러니 남아있어서 컴파일 에러가 났던 아찔한 기억이 있습니다. 그래서 저는 실전에서 거의 무조건 `git stash -u` (또는 `--include-untracked`) 옵션을 사용합니다. 이 옵션을 사용해야 새로 만든 파일까지 안전하게 보관함으로 들어갑니다. 복구할 때는 `git stash pop`을 사용합니다.
🏷️ 2단계: 이름표 붙이기 (검은 봉지 탈출)
앞서 말씀드린 '검은 비닐봉지' 사태를 막기 위해, 저는 모든 스태시에 메시지를 붙일 것을 강력하게 권장합니다. 기본 명령어 대신 `git stash save "메시지"` 또는 최신 버전의 Git에서는 `git stash push -m "메시지"`를 사용하세요. 이것은 선택이 아닌 필수 습관이 되어야 합니다.
예를 들어, `git stash push -m "로그인 기능 리팩토링 중단_20231025_오류있음"`라고 저장해두면, 일주일 뒤에 봐도 이것이 무엇인지, 왜 저장했는지 명확히 알 수 있습니다. 제 경험상, 메시지 없는 스태시는 결국 삭제하게 됩니다. 내용 확인이 귀찮아서 "에이, 중요한 거면 커밋했겠지" 하고 지워버리거든요. 그러다 며칠 밤새워 짠 코드를 날리고 피눈물 흘리는 경우를 너무 많이 봤습니다.
🎯 3단계: 부분 스태시 (Patch Mode) - 고수의 영역
이건 정말 시니어 개발자들만 아는 꿀팁입니다. 파일 전체가 아니라, 파일 내의 특정 변경 사항만 골라서 스태시하고 싶을 때가 있습니다. 예를 들어, 디버깅을 위해 찍어둔 `console.log`나 `print` 코드는 작업 공간에 남겨두고, 비즈니스 로직 변경만 스태시하고 싶을 때 말이죠.
이때 `git stash -p` (patch 옵션)를 사용합니다. 이 명령어를 실행하면 Git이 변경된 코드 덩어리(Hunk)를 하나씩 보여주며 대화형으로 물어봅니다. "이 부분을 스태시 할까요? (y/n)". 여러분은 마치 쇼핑하듯이 원하는 코드만 골라서 임시 저장소에 넣을 수 있습니다. 이 기능을 능숙하게 사용하면 동료들에게 "Git 좀 다루네?"라는 소리를 듣게 될 뿐만 아니라, 커밋 단위를 매우 정교하게 관리할 수 있습니다.
3. 스태시 적용의 두 가지 갈림길: Pop vs Apply 완벽 비교
스태시한 코드를 다시 가져오는 방법에는 크게 두 가지가 있습니다. `pop`과 `apply`입니다. 이 둘의 차이를 명확히 아는 것이 데이터 손실을 막는 핵심입니다. 많은 분이 습관적으로 `pop`만 사용하는데, 이는 위험할 수 있습니다.
| 구분 | 명령어 | 동작 방식 및 특징 | 스택 유지 여부 | 추천 상황 |
|---|---|---|---|---|
| 꺼내고 지우기 | git stash pop
|
댓글
댓글 쓰기