본문 바로가기
utils/git and github

[git] stash : 현재 작업을 임시 저장

by ds31x 2023. 12. 31.

stash는 Git에서 제공하는 중요한 기능 중 하나로,

  • 아직 커밋할 준비가 되지 않은 변경 사항을 임시로 저장하여
  • working tree를 깨끗히 해야하는 경우 사용됨.
변경 등의 작업이 이루어진 경우, 
해당 작업 내용은 Unstaged Area나 Staged Area 둘 중 하나에 위치함. 

이때 만약 해당 작업을 commit하지 않고 다른 branch로 변경(switch)할 경우 
해당 변경 사항이 같이 이동할 branch에 적용이 되기 때문에 
기존의 branch 의 내용과 어긋날 경우 conflict가 일어나게 됨.

 


stash 가 필요한 상황

이 기능은 다음과 같은 다양한 상황에서 유용하게 활용됨.


작업 임시 중단하고 이 후 재개

  • 작업을 중단해야 하지만 아직 커밋할 준비가 되지 않았을 때,
  • git stash를 사용하여 현재 변경 사항을 저장하고
  • 작업을 재개할 수 있을 때 다시 불러와서 작업을 이어서 할 수 있음.

branch 전환

  • (버그 수정 등으로 인해) 다른 branch로 전환해야 할 때,
  • 현재 branch의 변경 사항을 stash에 저장한 후 (commit을 할 정도로 완성된 상태가 아니라서)
  • 깨끗한 working tree 상태로 다른 branch로 이동 가능하게 해 줌.

병합 (merge or rebase 등) 중 발생하는 conflict 해결

  • merge 또는 rebase 에서 conflict 발생시,
  • 현재 작업 내용을 stash에 임시 저장하고 깨끗한 working tree로 만들어서
  • 일단 병합 하고 임시 저장된 내용과의 conflict 를 일으키는 내용을 수정하고,
  • 이후 stash의 저장된 작업을 다시 불러올 수 있음.

임시 저장

  • 실험적인 변경을 시도하기 전에 현재 상태를 stash에 저장하고,
  • 해당 실험이 종료하면 아까의 원래 상태로 쉽게 되돌리는데 사용 가능.

유용한 stash 관련 명령어

  • git stash save :
    • save 는 생략가능하며 기본로 WIP (Working In Progress) 라는 이름에 저장됨.
  • git stash list :
    • 현재 stash에 저장된 목록(list)를 출력.
  • git stash pop:
    • stash 목록(list)에서 가장 최근 항목을 꺼내(pop)
    • 현재 branch에 적용하고
    • 해당 항목을 stash list에서 제거합니다.
    • stash@{n} 로 번호 n 을 통해 빼내고자 하는 항목을 지정할 수 있음.
  • git stash apply stash@{n}:
    • 번호로 지정된 stash list 를
    • 현재 branch에 적용.
    • pop 과 달리 여전히 list 에 남아있는게 다른 점임.
    • stash@{n} 을 지정하지 않을 경우, 가장 최근 항목이 branch 에 적용됨.
  • git stash drop stash@{n}:
    • stash list 에서
    • 번호로 지정된 특정 stash 항목을 삭제.
    • 번호를 지정하지 않은 경우 최근 항목이 삭제됨.
  • git stash clear:
    • stash list 의 모든 스태시 항목을 삭제.