git stash
Stash the changes in a dirty working directory away
— Git 공식 매뉴얼(man git-stash)
미완성된 내 부끄러운 쓰레기 코드들을 일단 안 보이는 곳으로 밀어두고 엄청나게 깔끔하고 유능한 척 사기 치게 만드는 도구. 여기에 넣어둔 코드가 대충 15개 정도 쌓여 있는데, 솔직히 뭐가 뭔지 기억 하나도 안 난다(...)
1. 개요
작업 디렉터리에서 작업 중이던 미완성 변경 사항(추적 중인 modified 파일 등)들을 일시적으로 안전하게 숨겨두는 가상 서랍장이다. 다른 브랜치로 긴급하게 넘어가 버그 패치를 해야 하거나, 작업 도중 현재 환경을 어지럽히지 않고 깨끗하게 원격 서버 소스 코드를 내려받고 싶을 때 생명의 소중한 은인 노릇을 톡톡히 해낸다.
2. 장롱 속에 쑤셔 박기: stash와 pop
코드를 절반쯤 건드렸는데 갑자기 라이브 서버에 긴급 화재가 나서 다른 브랜치로 옮겨 불을 꺼야 할 때, 커밋하기엔 너무 어설퍼 곤혹스러울 때 git stash 한 줄만 치면 끝난다. 신기하게도 모든 변경 내역들이 깨끗이 증발하며 방금 클론받은 듯한 순결한 상태로 복귀한다. 급무를 모두 끝내고 돌아와 git stash pop을 외치는 순간, 이불 밑에 숨겨둔 헌 옷가지마냥 당시의 작업물들이 고스란히 튀어나와 복원된다.1
3. 추적되지 않은 도망자들: --include-untracked
대체로 뉴비들이 실수하는 포인트는, 새로 만든 신규 생성 파일(untracked file)들이 stash를 쳤음에도 여전히 터미널에 떡하니 빨갛게 살아남아 서성이는 것을 목격할 때다. 깃의 기본 stash는 한 번이라도 버전 추적이 시작된 modified 파일들만 감지해 옷장에 집어넣기 때문이다. 새로 태어난 아기 파일들까지 통째로 자루에 넣으려면 잊지 말고 git stash -u (또는 --include-untracked) 라는 옵션을 선사해야 안심하고 이사할 수 있다.
4. 실제 사용 예시
지금 작업 중인 변경 사항을 잠깐 치워두고 다른 브랜치로 이동해야 할 때 사용한다. 메시지를 붙여두면 나중에 무엇을 숨겼는지 덜 헷갈린다.
git stash push -m "wip: login form"
git switch main
# 숨겨둔 목록 보기
git stash list
# 가장 최근 stash를 다시 적용하고 목록에서 제거
git stash pop
새 파일까지 함께 숨기려면 -u를 붙인다.
git stash push -u -m "wip: include new files"
git stash apply stash@{0}
5. 관련 밈 및 드립
5.1. 엄마 온다! 장롱 정리
실제 주말 밤에 졸면서 지저분하고 족보 없는 코드를 산더미처럼 작성하다가 갑자기 사수가 헐레벌떡 코드 리뷰 화상 미팅을 걸어왔을 때, 다급하게 git stash를 쳐서 화면을 깨끗하고 프로페셔널한 상태로 가꾼 뒤 사수의 칭찬을 유도하는 실제 눈물겨운 순간을 패러디한 생존형 밈이다.
5.2. Stash 유실 대란
임시 보따리에 싸둔 물건들을 정리하지 않은 채 stash@{0}, stash@{1}, stash@{12} 처럼 수없이 방치해 두다가, 어떤 보따리에 무슨 기능을 고치던 흔적이 들었는지 다 잊어버려 결국엔 하나씩 다 꺼내보다가 충돌 더미가 연쇄 폭발하며 영혼이 정화되는 참상 드립이다.
6. 여담
- 팝 vs 어플라이:
pop은 물건을 꺼내오면서 옷장에서 그 목록을 완전히 지우지만,apply는 물건의 복사본만 쏙 꺼내오고 옷장 내 보관 장부를 영구 보존해 주어 혹시 모를 훼손에 대비할 수 있어 더 안전하다. - 보따리 작명: 귀찮다고 그냥 stash 치지 말고
git stash save "로그인 수정중"처럼 예쁜 이름을 붙여주면 훗날 꺼낼 때 동공이 풀리지 않는다. - 가지치기 응용:
git stash branch <이름>을 입력하면, 저장해 둔 임시 변경분을 기반으로 그 상태를 유지한 새 독자 브랜치를 즉각 발아시켜 분가해 나갈 수도 있는 놀라운 재주를 부린다.