Original article: Git Stash Explained: How to Temporarily Store Local Changes in Git

Git에는 저장소에 커밋하지 않고 작업한 내용의 스냅샷을 임시 저장할 수 있는 stash라는 영역이 있습니다. Stash 영역은 Git 사용자가 흔히 알고 있는 워킹 트리(Working Tree/Working Directory), 스테이징 영역(staging area), 또는 저장소(repository)와는 별개입니다.

이 기능은 해당 브랜치에 커밋할 준비가 되지 않은 변경 사항을 작업한 상태에서 다른 브랜치로 전환해야 할 때 유용합니다. (Stash는 영어로 안전한 곳에 무언가를 넣어두거나 숨긴다는 의미입니다. --옮긴이).

작업한 내용을 stash(임시 저장) 하기

변경 사항을 stash 영역에 저장하려면 다음과 같은 명령어를 실행합니다.

git stash save "<사용자 옵션(optional message)>"

이 명령어를 실행하면 작업한 내용이 임시 저장되고, 워킹 트리가 최신 커밋이 적용된 시점으로 되돌아갑니다. Stash된 변경 사항은 해당 저장소의 모든 브랜치에서 접근할 수 있습니다.

여기서 중요한 점 한 가지는 저장할 변경 사항은 tracked file(즉, Git 저장소에서 변경 사항을 추적하고 있는 상태의 파일 --옮긴이)에 있어야 한다는 사실입니다. 새 파일을 만든 후 변경 사항을 stash하려고 하면 저장할 로컬 변경 사항이 없다는 의미의 (No local changes to save)에러가 발생할 수 있습니다.

(git stash --include-untracked라는 명령어를 실행하면 untracked file도 stash가 가능합니다. --옮긴이)

Stash한 변경 사항 확인하기

Stash 영역에 무엇이 있는지 확인하려면 다음 명령어를 실행합니다.

git stash list

명령어가 실행되면 임시 저장된 스냅샷의 목록을 stash@{0}: On <stash한 내용이 담긴 브랜치 이름: 사용자 선택 메시지>형식으로 반환합니다. stash@{0}부분은 해당 stash의 이름이고, 중괄호({ }) 안의 숫자는 해당 stash의 인덱스입니다. Stash 영역에 여러 개의 변경 사항을 저장한 경우 각 임시 저장의 인덱스가 다릅니다.

Stash 영역에 어떤 내용이 임시 저장되었는지 잊어버린 경우에는 git stash show <STASH 이름>로 요약을 확인할 수 있습니다. 일반적인 diff-style의 패치 레이아웃(라인별 변경 사항을 +-기호로 표시된)으로 변경 사항을 확인하고 싶다면, 명령어에 패치라는 의미의 -p 플래그를 포함하면 됩니다. 예시를 확인해보시죠.

git stash show -p stash@{0}

# 예시 결과물:
diff --git a/PathToFile/fileA b/PathToFile/fileA
index 2417dd9..b2c9092 100644
--- a/PathToFile/fileA
+++ b/PathToFile/fileA
@@ -1,4 +1,4 @@
-현재 브랜치에 보이는 내용 
+stash된 변경 사항이 반영된 내용

Stashed된 내용을 불러오기

Stashed된 내용을 불러오고 현재 체크아웃된 브랜치에 적용하려면 두 가지 방법이 있습니다.

  1. git stash apply <STASH-이름>명령어는 변경 사항을 적용하고 해당 내용의 복사본을 stash 영역에 남깁니다.
  2. git stash pop <STASH-이름>명령어는 변경 사항을 적용하고 적용된 파일을 stash 영역에서 삭제합니다.

변경 사항을 적용할 때 충돌이 발생할 수 있습니다. 이때 병합 충돌(merge conflict)과 유사한 방법으로 충돌을 해결할 수 있습니다(git merge에 관한 아티클을 확인해보세요).

Stash된 작업 내용 삭제하기

Stash된 내용을 브랜치에 적용하지 않은 상태에서 삭제하려면 다음 명령어를 실행합니다.

git stash drop <STASH-이름>

Stash 영역에 있는 모든 내용을 삭제하려면 다음과 같은 명령어를 실행합니다.

git stash clear