개발이 취미인 사람

[Git] - Git Stash - 임시 저장 활용법 본문

컴퓨터공학/Git

[Git] - Git Stash - 임시 저장 활용법

RyanSin 2025. 12. 26. 20:00
반응형

개요

안녕하세요. 이번 시간에는 Git Stash에 대해 알아보겠습니다. Stash는 작업 중인 변경사항을 임시로 저장하는 기능으로, 브랜치 전환이나 긴급 작업 시 매우 유용합니다. 실무에서 자주 사용하는 필수 기능이니 꼭 익혀두시기 바랍니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.

 

[Git] - Pull Request(PR) / Merge Request(MR) 작성법

 

- Stash란?

Stash는 현재 작업 중인 변경사항을 임시로 저장해두는 Git의 기능입니다. 커밋하지 않은 변경사항을 안전하게 보관하고, 나중에 다시 불러올 수 있습니다.

 

Stash의 필요성

상황 1: 기능 개발 중인데 긴급 버그 수정 요청이 들어옴
- 현재 작업을 커밋하기엔 아직 완성되지 않음
- 하지만 브랜치를 전환해야 함
- 해결: Stash로 임시 저장!

상황 2: 잘못된 브랜치에서 작업함
- develop에서 작업해야 하는데 main에서 작업 중
- 변경사항을 이동시켜야 함
- 해결: Stash로 저장하고 올바른 브랜치로 이동!

상황 3: pull 전에 로컬 변경사항이 있음
- git pull을 해야 하는데 충돌 우려
- 해결: Stash로 저장하고 pull 후 복원!

Stash 저장 위치

Working Directory    Stash Stack    Repository
 (작업 디렉토리)        (임시 저장소)      (저장소)
      |                   |               |
      | git stash save    |               |
      | ----------------> |               |
      |                   |               |
      | git stash pop     |               |
      | <---------------- |               |

Stash는 스택(Stack) 구조로 관리됩니다. 가장 최근에 저장한 것이 가장 먼저 나옵니다.

- Stash 기본 명령어

1. 변경사항 저장하기

# 기본 stash 저장
git stash

# 또는
git stash save

# 메시지와 함께 저장 (권장)
git stash save "작업 내용 설명"

# 예시
git stash save "로그인 기능 작업 중"

# 출력
Saved working directory and index state On feature/login: 로그인 기능 작업 중

2. Stash 목록 확인하기

# 저장된 stash 목록 보기
git stash list

# 출력 예시
stash@{0}: On feature/login: 로그인 기능 작업 중
stash@{1}: WIP on main: a1b2c3d Update README
stash@{2}: On develop: 결제 모듈 테스트

stash 번호 이해하기:

  • stash@{0}: 가장 최근에 저장한 stash
  • stash@{1}: 그 이전에 저장한 stash
  • stash@{2}: 더 이전에 저장한 stash

 

3. Stash 내용 확인하기

# 가장 최근 stash의 변경사항 확인
git stash show

# 출력
 src/login.js | 15 +++++++++++++++
 src/auth.js  |  8 ++++++--
 2 files changed, 21 insertions(+), 2 deletions(-)

# 상세 변경 내용 확인 (diff)
git stash show -p

# 특정 stash 확인
git stash show stash@{1}
git stash show -p stash@{1}

4. Stash 복원하기

# 방법 1: pop (복원 후 stash 삭제) - 일반적으로 사용
git stash pop

# 특정 stash를 pop
git stash pop stash@{1}

# 방법 2: apply (복원 후 stash 유지)
git stash apply

# 특정 stash를 apply
git stash apply stash@{2}

pop vs apply 차이:

명령어 복원 stash 보존 사용 시점

pop ❌ 삭제됨 일반적인 경우 (권장)
apply ✅ 유지됨 여러 브랜치에 적용해야 할 때

5. Stash 삭제하기

# 가장 최근 stash 삭제
git stash drop

# 특정 stash 삭제
git stash drop stash@{1}

# 모든 stash 삭제
git stash clear

# 삭제 전 확인
git stash list

 

 

 

- Stash 고급 사용법

1. Untracked 파일도 함께 저장

기본적으로 stash는 추적 중인(tracked) 파일만 저장합니다.

# 새로 생성한 파일(untracked)도 함께 저장
git stash save -u "메시지"

# 또는
git stash save --include-untracked "메시지"

# 예시
echo "새 파일" > new-file.txt
git stash save -u "새 파일 포함하여 저장"

2. 특정 파일만 Stash

# 특정 파일만 stash (Git 2.13+)
git stash push -m "메시지" 파일1 파일2

# 예시
git stash push -m "로그인 파일만 저장" src/login.js src/auth.js

3. Stash를 브랜치로 만들기

stash를 새로운 브랜치로 만들 수 있습니다.

# stash를 새 브랜치로 생성
git stash branch 브랜치명

# 예시
git stash branch feature/stashed-work

# 결과:
# 1. 새 브랜치 생성
# 2. stash 내용이 자동으로 적용됨
# 3. stash가 자동으로 삭제됨

4. Stash를 커밋으로 확인

# stash는 내부적으로 커밋입니다
# stash의 커밋 해시 확인
git stash list --format="%gd: %H"

# 출력
stash@{0}: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0

- 실전 시나리오

시나리오 1: 긴급 버그 수정

# 상황: feature/payment 브랜치에서 결제 기능 개발 중
# 긴급: main 브랜치의 버그를 수정해야 함

# 1. 현재 작업 저장
git stash save "결제 기능 개발 중"

# 2. 상태 확인 (깨끗한 상태)
git status
# On branch feature/payment
# nothing to commit, working tree clean

# 3. main 브랜치로 이동
git checkout main

# 4. 버그 수정
# ... 버그 수정 작업 ...
git add .
git commit -m "fix: 긴급 버그 수정"

# 5. 다시 feature/payment로 돌아가기
git checkout feature/payment

# 6. 저장했던 작업 복원
git stash pop

# 7. 계속 작업
# ... 결제 기능 개발 계속 ...

시나리오 2: 잘못된 브랜치에서 작업

# 상황: main 브랜치에서 작업했는데, develop에서 했어야 함

# 1. 변경사항 확인
git status
# On branch main
# Changes not staged for commit:
#   modified:   src/app.js

# 2. 현재 작업 저장
git stash save "develop에서 작업해야 하는 내용"

# 3. 올바른 브랜치로 이동
git checkout develop

# 4. 저장했던 작업 복원
git stash pop

# 5. 이제 올바른 브랜치에서 작업 계속
git add .
git commit -m "feat: 새 기능 추가"

시나리오 3: Pull 전에 로컬 변경사항 처리

# 상황: 원격 저장소를 pull 해야 하는데 로컬에 변경사항이 있음

# 1. 현재 작업 저장
git stash save "pull 전 로컬 작업"

# 2. 원격 저장소에서 최신 코드 가져오기
git pull origin develop

# 3. 저장했던 작업 복원
git stash pop

# 4. 충돌이 발생하면 해결
# ... 충돌 해결 ...
git add .

시나리오 4: 여러 브랜치에 같은 수정 적용

# 상황: 같은 버그 수정을 여러 브랜치에 적용해야 함

# 1. 버그 수정 작업
# ... 버그 수정 ...

# 2. 수정 내용을 stash로 저장
git stash save "공통 버그 수정"

# 3. 첫 번째 브랜치에 적용
git checkout feature/login
git stash apply  # apply 사용 (stash 유지)
git add .
git commit -m "fix: 버그 수정"

# 4. 두 번째 브랜치에 적용
git checkout feature/payment
git stash apply  # 같은 stash를 다시 apply
git add .
git commit -m "fix: 버그 수정"

# 5. 세 번째 브랜치에 적용
git checkout feature/profile
git stash pop    # 마지막은 pop으로 stash 삭제
git add .
git commit -m "fix: 버그 수정"

- Stash 워크플로우 전체 예시

실제 개발 과정에서의 stash 사용 예시입니다.

# === 오전 9시: 새 기능 개발 시작 ===
git checkout -b feature/user-dashboard
# ... 코딩 ...
echo "대시보드 컴포넌트" > dashboard.js

# === 오전 11시: 긴급 회의로 인한 작업 중단 ===
git stash save "대시보드 기능 개발 중 - 50% 완성"

# === 오후 2시: 다른 긴급 작업 ===
git checkout develop
git checkout -b hotfix/security-issue
# ... 보안 이슈 수정 ...
git commit -m "fix: 보안 취약점 수정"
git checkout develop
git merge hotfix/security-issue

# === 오후 3시: 원래 작업 재개 ===
git checkout feature/user-dashboard
git stash list
# stash@{0}: On feature/user-dashboard: 대시보드 기능 개발 중 - 50% 완성

git stash pop
# ... 작업 계속 ...

# === 오후 5시: 작업 완료 ===
git add .
git commit -m "feat: 사용자 대시보드 구현 완료"
git push origin feature/user-dashboard

- Stash와 Commit 비교

 

항목 Stash Commit

목적 임시 저장 영구 저장
공유 로컬 전용 원격 공유 가능
히스토리 포함 안됨 포함됨
메시지 선택 사항 필수
사용 시점 작업 중단 시 작업 완료 시
복원 pop/apply checkout

언제 Stash를 쓸까?

✅ Stash 사용:
- 작업이 아직 완성되지 않았을 때
- 임시로 다른 작업을 해야 할 때
- 커밋하기에는 너무 작은 변경일 때

✅ Commit 사용:
- 작업이 완성되었을 때
- 의미있는 변경 단위일 때
- 팀원과 공유해야 할 때

- Stash 충돌 해결

stash를 복원할 때 충돌이 발생할 수 있습니다.

충돌 발생 예시

# stash pop 시도
git stash pop

# 충돌 발생!
Auto-merging src/app.js
CONFLICT (content): Merge conflict in src/app.js

충돌 해결 방법

# 1. 충돌 파일 확인
git status

# 출력
Unmerged paths:
  both modified:   src/app.js

# 2. 파일 열어서 충돌 부분 수정
# src/app.js 파일 내용:
<<<<<<< Updated upstream
현재 브랜치의 내용
=======
Stash에 저장된 내용
>>>>>>> Stashed changes

# 3. 충돌 해결 후 저장
# ... 원하는 내용으로 수정 ...

# 4. 스테이징
git add src/app.js

# 5. stash 충돌 해결 완료
# (자동으로 stash가 삭제됨)

# 만약 stash를 유지하고 싶다면
git stash drop  # 수동으로 삭제

충돌 시 안전하게 취소하기

# 충돌이 복잡해서 취소하고 싶을 때
git reset --merge

# stash는 그대로 유지되므로 나중에 다시 시도 가능

- 자주 하는 실수와 해결법

실수 1: Stash를 까먹음

문제:

git stash save "중요한 작업"
# ... 한참 후 ...
# 어디에 저장했더라?

해결:

# 항상 의미있는 메시지와 함께 저장
git stash save "로그인 기능 - 폼 유효성 검사 추가 중"

# stash 목록 확인
git stash list

실수 2: 여러 개의 Stash가 쌓임

문제:

git stash list
stash@{0}: WIP on main
stash@{1}: WIP on develop
stash@{2}: WIP on feature
stash@{3}: WIP on bugfix
# ... 너무 많아!

해결:

# 필요없는 stash 정리
git stash drop stash@{3}
git stash drop stash@{2}

# 또는 특정 stash를 최신으로 만들기
git stash apply stash@{3}
git stash drop stash@{3}
git stash save "정리한 작업"

# 모두 삭제하고 새로 시작
git stash clear

실수 3: Stash 했는데 파일이 사라짐

문제:

git stash save
# 어? 파일이 다 사라졌어!

설명:

Stash는 정상 작동한 것입니다!
- stash는 변경사항을 "임시 보관"하고
- 작업 디렉토리를 "깨끗한 상태"로 만듭니다

복원:

# 바로 복원하면 됩니다
git stash pop

실수 4: Stash Pop 후 충돌 발생

문제:

git stash pop
# 충돌 발생... 어떻게 하지?

주의:

충돌이 발생하면 stash가 자동으로 삭제되지 않습니다!
수동으로 충돌을 해결한 후 drop 해야 합니다.

해결:

# 1. 충돌 해결
# ... 파일 수정 ...
git add .

# 2. stash 수동 삭제
git stash drop

# 또는 처음부터 apply 사용
git stash apply  # 충돌 해결 후에도 stash 유지

실수 5: 잘못된 Stash를 Pop

문제:

git stash pop
# 어? 이게 아닌데...

해결:

# 1. 바로 다시 stash로 저장
git stash save "다시 저장"

# 2. 원하는 stash 찾기
git stash list

# 3. 올바른 stash 복원
git stash pop stash@{1}

- Stash 명령어 정리

# === 저장 ===
git stash                              # 현재 변경사항 저장
git stash save "메시지"                 # 메시지와 함께 저장
git stash save -u "메시지"              # untracked 파일 포함
git stash push -m "메시지" 파일명       # 특정 파일만 저장

# === 확인 ===
git stash list                         # stash 목록 보기
git stash show                         # 최근 stash 변경사항
git stash show -p                      # 최근 stash 상세 내용
git stash show stash@{N}               # 특정 stash 확인

# === 복원 ===
git stash pop                          # 최근 stash 복원 및 삭제
git stash pop stash@{N}                # 특정 stash 복원 및 삭제
git stash apply                        # 최근 stash 복원 (유지)
git stash apply stash@{N}              # 특정 stash 복원 (유지)

# === 삭제 ===
git stash drop                         # 최근 stash 삭제
git stash drop stash@{N}               # 특정 stash 삭제
git stash clear                        # 모든 stash 삭제

# === 고급 ===
git stash branch 브랜치명               # stash를 브랜치로 만들기

- Stash 사용 팁

1. 의미있는 메시지 작성

❌ 나쁜 예:
git stash save "임시"
git stash save "작업중"

✅ 좋은 예:
git stash save "로그인 폼 - 이메일 유효성 검사 추가 중"
git stash save "결제 API 연동 - 테스트 코드 작성 전"

2. 주기적으로 Stash 정리

# 일주일에 한 번 정도 확인
git stash list

# 필요없는 것은 삭제
git stash drop stash@{5}
git stash drop stash@{4}

# 또는 필요한 것만 남기고 모두 삭제
git stash clear

 

3. Stash 전에 Diff 확인

# stash 하기 전에 무엇이 저장되는지 확인
git diff

# 변경사항 확인 후 stash
git stash save "확인한 변경사항"

4. Pop 대신 Apply 사용 고려

# 안전하게 apply로 먼저 확인
git stash apply

# 문제 없으면 수동으로 삭제
git stash drop

# 문제 있으면 다시 reset
git reset --hard

5. 브랜치 전환 전에 항상 확인

# 브랜치 전환 전에
git status

# 변경사항이 있다면
git stash save "브랜치 전환 전 작업"

# 그 다음 브랜치 전환
git checkout other-branch

마무리

이번 시간에는 Git Stash의 사용법에 대해 알아봤습니다. Stash는 작업 중인 변경사항을 임시로 저장하는 매우 유용한 기능입니다. 브랜치 전환, 긴급 작업, pull 전 변경사항 처리 등 실무에서 자주 사용하게 되니 꼭 익숙해지시길 바랍니다. 특히 git stash pop과 git stash apply의 차이를 이해하고, 의미있는 메시지와 함께 저장하는 습관을 들이는 것이 중요합니다.

다음 시간에는 Git Tag - 버전 관리 및 릴리즈에 대해 알아보겠습니다.