개발일지/Git

Git stash 활용하기

cotnmin 2023. 2. 6. 00:20

git stash는 git에서 변경사항을 임시로 저장하거나 롤백할 때 사용할 수 있는 명령어이다.
해당 명령어와 이를 적극적으로 활용할 수 있는 방법에 대해 작성하였다.

명령어 살펴보기

git stash 아래에는 수많은 명령어가 있지만 아래 8가지 명령어 만으로 stash를 완전 활용 가능하다.
1, 2, 3, 6번 만으로도 웬만한 활용은 가능하다.

  1. git stash (push)
  2. git stash list
  3. git stash pop
  4. git stash apply
  5. git stash drop
  6. git stash clear
  7. git stash show
  8. git stash branch

1. git stash

현재 변경사항들을 임시저장하는 명령어로 임시저장할 수 있는 공간에 스택으로 저장한다.
push를 생략해 git stash 만으로 처리 가능하다.
이때 -p 옵션을 주면 변경사항을 체크해 일부만 저장할 수 있다.
git stash -p 입력 시 변경사항과 함께 [y, n, q, a, d, j, J, g,/,s, e,?]를 입력할 수 있게 되는데 주어진 변경사항을 어떻게 처리할지 결정할 수 있다. 해당 명령어 중 일부만 나타날 수 있다.

  • y: 이 변경사항 반영
  • n: 이 변경사항 무시
  • q: 이 변경사항과 이후 모든 변경사항 무시
  • a: 이 변경사항 및 이 파일에 남은 변경사항 변경
  • d: 이 변경사항 및 이 파일에 남은 변경사항 무시
  • j: 건너뛰기 (전에 건너뛴 부분이 있었다면 해당 부분으로 이동)
  • J: 건너뛰기
  • g: 원하는 변경사항으로 이동
  • /: 정규직으로 원하는 변경사항 탐색
  • s: 이 변경사항을 쪼개기
  • e: 이 변경사항 수정하기
  • ?: 도움말 출력

2. git stash list

현재 저장된 stash 스택을 확인한다.
stash@{<stash id>}: WIP on <branch>: <commit id> <commit message> 형태로 저장되어 있다.

3. git stash pop <stash id>

주어진 <stash id>의 변경내역을 꺼낸다. 꺼내진 stash는 삭제된다. 생략한다면 0을 꺼낸다.
꺼내는 중 conflict가 발생하면 stash를 삭제하지 않는다.

4. git stash apply <stash id>

주어진 <stash id>의 변경내역을 적용한다. 생략한다면 0을 적용한다.
pop과는 다르게 꺼내는 동시에 삭제하지 않는다.
변경사항을 임시저장만 하고 다시 작업하고 싶을 때 git stash && git stash apply로 편하게 쓸 수 있다.
(한 번에 처리 가능한 방법이 있다면 댓글 남겨주세요)

5. git stash drop <stash id>

주어진 <stash id>의 변경내역을 제거한다. 생략하면 0을 제거한다.

6. git stash clear

모든 stash 스택을 비운다.

7. git stash show

주어진 <stash id>의 변경내역을 확인한다. 생략하면 0을 확인한다.
별도의 옵션이 없으면 변경된 파일이름과 줄 수를 확인할 수 있다.
추가 옵션

  • -p: 상세 변경내역 확인
  • --color-words: 변경 내역을 단어 단위로 확인

8. git stash branch <branch name> <stash id>

주어진 <branch name>으로 <stash id>의 변경사항이 적용된 브랜치를 만든다. <stash id>를 생략하면 0을 확인한다.
정확히는 stash를 생성할 때 상태로 브랜치를 생성하는 것으로 혼동주의
git checkout -b <branch name> && git stash apply <stash id>와 다를 수 있음

 

 

명령어 활용

1. 커밋을 남기지 않고 현재 변경사항을 임시저장할 때 (기본 사용 목적)

  1. 저장 후 기존 깨끗한 HEAD 상태로 돌아가고 싶은 경우
  2. $ git stash # 추후 다시 해당 변경 사항을 불러오고 싶을 때 $ git stash pop
  3. 저장 후 현재 상태를 유지하고 싶은 경우
  4. $ git stash && git stash apply # 추후 다시 해당 변경 사항을 불러오고 싶을 때 $ git stash pop

2. 변경사항을 각각 다른 branch 여러 개에 적용하고 싶을 때

branch1 $ git stash && git stash apply
branch1 $ git checkout branch2
branch2 $ git stash apply
branch2 $ git checkout branch3
branch3 $ git stash pop

3. 작업 중인 branch에 협업자가 forced push를 해, push 사용 시 abort 되는 상황

branch_name $ git push origin branch_name
... abort ...
# push 를 했으나 abort 발생
# reset 을 이용해 커밋을 남기기 전으로 이동 (마지막으로 push 한 지점)
branch_name $ git reset HEAD^ 
branch_name $ git stash
branch_name $ git fetch --all
branch_name $ git reset --hard origin/branch_name
branch_name $ git stash pop
# 변경사항 확인 후 커밋 & push 진행

 

잘못된 내용이나 오타는 댓글을 남겨주세요. 읽어주셔서 감사합니다!

 

참고