작업 중에 잠시 다른 브랜치를 들러서 확인할 일이 있다거나, 잠깐 하던 작업이 없던 시점의 상태를 다시 보고 싶다거나, 여태 하던게 방향이 잘못된거 같아서 다 날리지만 코드 자체는 일단 어디 두고 싶은... 때가 있지요, 그럴때 자주 사용하는게 Git Stash 일텐데요, 오늘은 Git Stash 의 사용법에 대해서 한번 정리해보려고 합니다! (왜냐하면 제가 그동안 pop 만 쓰다가 최근에 apply 를 배웠기 때문..!)
조금 뻔한 전개 같긴 하지만... 새삼 영어 단어 의미가 궁금해서 한번 찾아봤는데요.
아래와 같은 뜻이라고 합니다. 임시로 하던 일을 잠시 치워놓는 느낌의 명령어로 알맞은 것 같네요.
터미널을 이용해 테스트 파일을 만들면서 기본 사용법을 한번 알아봅시다!
1. 변경 사항 저장:
git stash
현재 작업 중인 변경 사항이 임시로 저장되고, 작업 디렉토리는 마지막 커밋 상태로 돌아갑니다.
표시된 안내문구를 살펴보면, 아래와 같이 생각할 수 있을 것 같습니다.
• Saved working directory and index state: 작업 디렉토리(Working Directory)와 인덱스(Index, 스테이징된 변경 사항)의 상태를 저장
• WIP (Work In Progress): 진행 중
• on main: 현재 브랜치 (main)
• 787b435 1st commit : 현재 브랜치의 마지막 커밋의 커밋 ID 와 그 메세지
2. 저장된 stash 목록 보기:
git stash list
stash로 저장된 항목의 목록을 확인할 수 있습니다.
3. 저장된 변경 사항 적용 (stash pop):
git stash pop
가장 최근에 저장된 stash를 다시 적용합니다. pop 이라는 이름에서 알 수 있듯 stash 는 stack 형태로 리스트를 관리하는데요, pop 은 가장 최근에 들어간 내용을 불러오고, 또 stash 목록에서 제거합니다.
4. 특정 stash 적용 (stash apply):
git stash apply stash@{n}
apply 또한 별도 인덱스 지정이 없다면 가장 최근에 저장된 stash를 다시 적용합니다. 다만 pop과 달리 stash 목록에서 해당 데이터를 제거하지 않습니다.
stash@{n}은 git stash list에서 확인한 인덱스를 사용합니다. <📍 인덱스가 0 에 가까울수록 최신 작업!>
5. 메시지와 함께 stash 저장:
git stash save "메시지"
stash 만 하니까 너무 헷갈리죠. 나중에 쉽게 알아볼 수 있도록 메시지를 추가할 수 있습니다.
git stash list 결과상으로는 Parent Commit 정보가 사라지는 것 아닐까? 라고 생각할 수도 있지만, 이곳에서의 message 는 단지 해당 stash 에 라벨을 붙여주는 역할을 할 뿐, Parent Commit 정보는 내부적으로 가지고 있기 때문에 여전히 apply 해서 가지고 올 수가 있다고 합니다. (.git 폴더의 objects 파일 내부에서 해당 커밋과 관련 메타데이터를 관리하고 있음!)
6. stash 제거 (특정 stash, 모든 stash) :
git stash drop stash@{n}
git stash clear
필요없어진 작업내용이 있다면 stash를 삭제합니다. stash 해놓고 잊혀진 코드들이 잠들어 있을 수 있으니까요!
매번 git stash / git stash pop 만 써왔는데, stash 자체에도 여러가지 기능이 있었네요! 이 밖에도 staging 된 부분만 stash 하기, 특정 파일만 stash 하기 등 다양한 기능이 있어서 여러모로 쓰기 좋을 것 같습니다. 익숙해지면 이제 나도 stash 의 달인!(좋은건가?)