Stash - 임시저장

Stash - 임시저장

Stash란?

Git의 stash는 작업 중인 변경 사항을 임시로 저장하여 로컬 작업 디렉터리를 깨끗한 상태로 되돌리는 Git 명령어입니다.

  • 브랜치를 변경하거나, 원격 데이터를 가져오면서 작업 내용을 안전하게 보관하고 싶을 때 유용합니다.
  • 변경 사항은 스택(stack) 구조로 저장되며, 언제든 다시 복원할 수 있습니다.

Stash의 저장 방식

  • Stash는 Git 로컬 저장소의 refs/stash라는 특별한 참조로 저장됩니다.
  • 이는 디스크에 저장되며, 메모리 스택과는 무관합니다.
  • Stash는 Git 저장소의 일부로 관리되므로, 컴퓨터 재부팅이나 시스템 충돌에도 영향을 받지 않습니다. 다만, 로컬 저장소를 삭제하거나 손실되면 함께 사라집니다.

Stash의 주요 사용법

변경 사항 저장

작업 중인 변경 사항을 임시로 저장합니다:

git stash
  • Tracked 파일(Git이 추적하는 파일)의 변경 내용만 저장합니다.
  • Untracked 파일(새로 생성된 파일)은 기본적으로 저장되지 않습니다.

저장된 목록 확인

저장된 Stash 항목들을 확인합니다:

git stash list

출력 예:

stash@{0}: WIP on main: Add new feature
stash@{1}: WIP on main: Fix bug

Stash 복원

복원 후 Stash 유지

Stash에 저장된 내용을 작업 디렉터리에 복원합니다:

git stash apply

복원 후 Stash 삭제

복원 후, Stash 항목을 삭제합니다:

git stash pop

특정 Stash 복원

특정 Stash 항목을 복원하려면 stash@{n}을 명시합니다:

git stash apply stash@{1}

변경 사항 삭제

특정 Stash 삭제

git stash drop stash@{0}

모든 Stash 삭제

git stash clear

고급 사용법

Untracked 파일 포함

Untracked 파일까지 저장하려면 -u 옵션을 사용합니다:

git stash -u

특정 파일만 저장

특정 파일만 Stash에 저장하려면 경로를 지정합니다:

git stash push -m "Save specific file" path/to/file.txt

새로운 브랜치 생성

Stash 내용을 새로운 브랜치에서 작업하려면:

git stash branch new-branch-name
  • Stash를 복원하고, 새 브랜치를 생성한 후 Stash 항목을 삭제합니다.

Stash 삭제 트리거

Stash는 기본적으로 임시 저장소로 관리되며, 다음과 같은 이유로 삭제될 수 있습니다:

명시적인 삭제

  • git stash drop 또는 git stash clear 명령어로 삭제됩니다.

복원 중 삭제

  • git stash pop 명령어는 복원 후 해당 항목을 스택에서 제거합니다.

Git 가비지 컬렉션(GC)

  • Stash는 “임시 참조"로 관리되며, 일정 기간 동안 사용되지 않으면 GC 프로세스에서 제거될 수 있습니다.
  • 기본적으로 Git은 30일 이상 참조되지 않은 데이터를 제거합니다.

로컬 저장소 삭제

  • Stash는 로컬 Git 저장소에 저장되므로, 저장소를 삭제하면 Stash도 함께 사라집니다.

Stash의 구조

Git Stash는 스택stack 자료구조로 관리됩니다:

  • 최근에 저장된 항목이 스택의 맨 위에 위치(stash@{0}).
  • 오래된 항목은 아래로 밀려남.

스택 확인:

git stash list

스택 예시:

stash@{0}: WIP on main: Add new feature
stash@{1}: WIP on main: Fix bug
stash@{2}: WIP on main: Update README

실용적인 활용 시나리오

원격 변경 내용 반영

현재 작업 내용을 Stash에 저장한 후, 원격 브랜치를 업데이트합니다:

git stash
git pull origin main
git stash pop

브랜치 변경 중 작업 보존

다른 브랜치로 이동해야 할 때:

git stash
git checkout feature-branch
git stash pop

예시

  • a에서 b로 체크아웃
    • 현재 작업 디렉토리는 b 브랜치의 상태로 전환됩니다.
  • b에서 여러 파일 수정 및 추가 후 커밋(c)
    • 모든 변경 사항이 b 브랜치에서 커밋되므로, 워킹 디렉토리는 깔끔한 상태가 됩니다.
    • 이 시점에서 Git의 스냅샷(커밋)은 b 브랜치에만 영향을 줍니다.
  • d 파일 생성 후 git stash
    • git stash는 트래킹된 파일과 새로 추가된 수정된 상태를 임시 저장소(stash)에 저장합니다.
    • 중요한 점은, 새로 추가된 파일(d)도 트래킹 상태에 있어야 stash에 포함됩니다.
      예: git add d를 수행해야 d 파일이 스태시에 포함됩니다.
  • a로 체크아웃
    • 워킹 디렉토리는 a 브랜치의 상태로 전환됩니다.
    • 이 상태에서는 b 브랜치의 변경 사항이나 새로 추가된 파일(d)는 존재하지 않습니다.
  • git stash apply 실행
    • stash에 저장된 변경 사항이 현재 브랜치(a)로 복원됩니다.
    • b에서 커밋된 내용은 워킹 디렉토리에 영향을 미치지 않으며, 오직 stash에 저장된 내용(d 파일)만 반영됩니다.

Stash 항목 백업

Stash의 내용을 별도로 저장하거나 공유하려면:

git stash show -p stash@{0} > changes.patch

주의사항

중요한 변경 사항은 커밋

  • Stash는 임시 저장소이므로, 중요한 작업은 반드시 커밋하여 영구적으로 보존하세요.

복원 중 충돌

  • Stash를 복원할 때 충돌이 발생할 수 있습니다. 이 경우 충돌을 수동으로 해결해야 합니다.

Stash는 로컬에만 존재

  • Stash는 원격 저장소에 동기화되지 않으므로, 다른 환경에서는 사용할 수 없습니다.