본문 바로가기

Git

[Git] git의 stash 기능 알아보기

반응형

이번 포스팅에서는 git의 stash 기능에 대해 알아보려 한다. stash의 사전적 정의는 '몰래 숨겨두다' 라는 의미이다. 그러면 git에서 stash는 대체 무엇을 숨겨둔다는 것일까? 결론부터 말하면 stash 기능은 git add 로 특정 파일을 수정해서 staging area에 올려놓은 버전을 큐 와 비슷한 방식으로 돌아가는 자료구조에 백업해놓는다. 보다 자세한 기능을 알기 위해 다음 예시 화면을 천천히 따라가보자.

 

Github

 

우선, 아래와 같이 master 브랜치와 dev1 브랜치에 work1.txt 라는 동일한 파일이 존재하는 상태이다.

 

 

자, dev1 브랜치에서 work2.txt 라는 파일을 만들어 git add 하여 staging area에 올려놓아보자.

 

 

그런데 dev1 브랜치에서 커밋을 하기 전에 갑자기 master 브랜치로 돌아가야 할 일이 생겼다. 그래서 master 브랜치로 돌아갔다. 그런데 특이한 점이 발견되었다. dev1 브랜치에서 work2.txt 라는 새로운 파일을 만들어 git add 시켰는데, master 브랜치로 이동해서 master 브랜치의 디렉토리를 확인해보니 dev1 브랜치에서 만든 work2.txt가 갑자기 생긴 것을 볼 수 있고 또 git status를 확인해보니 dev1 브랜치에서 git add 한 파일이 master 브랜치에서도 영향이 미치는 것을 볼 수 있다. 그래서 master 브랜치에서 할 일을 하지 못하고 있다. 그러면 dev1 브랜치에서 git add 한 버전을 백업시켜놓을 순 없을까? 그것이 바로 git stash 명령어가 수행한다!

 

이제 dev1 브랜치로 다시 돌아가서 git stash 명령어를 입력시켜보자.

 

 

git stash로 work2.txt 파일을 add한 것을 백업시키고 ls를 눌러보니 감쪽같이 work2.txt가 사라지고 git status를 입력해보았더니 working tree가 깨끗하다고 뜬다. 이렇게 되면 원래 master 브랜치에서 하고 싶었던 일을 다시 할 수 있다. 그렇다면 숨겨둔(stash한) 백업 버전들을 어떻게 볼 수 있을까? git stash list 로 볼 수 있다.

 

 

현재 방금 stash 한 백업 버전이 한 개 들어있다. 이 stash 리스트들은 먼저 저장한 것들을 먼저 내보내는 자료구조의 특성을 가진다.(마치 큐의 FIFO 처럼 말이다)

 

이제 master 브랜치에서 하려 했던 일들을 모두 다 했다고 가정하고 dev1 브랜치로 돌아와서 백업 해두었던 버전을 다시 복원시켜놓아보자. 복원 명령은 git stash apply를 사용하는데, 이 때 stash가 담긴 자료구조에서 가장 먼저 백업시켜 놓았던 stash 버전을 갖고와 복원시켜놓는다.(참고로 apply 명령어는 생략 가능하다)

 

 

그리고 이제 work2.txt를 커밋시키자! 그러면 방금 복원시킨 stash는 stash list에서 사라졌을까? 아니다. stash list에서 꺼내와 복원시켜놓았다 하더라도 stash list에는 백업시킨 버전이 그대로 담겨있다. 따라서 백업해놓은 버전을 완전히 삭제하기 위해서는 git stash drop 을 사용해서 가장 먼저 백업시켜 놓은 stash를 자료구조에서 완전히 삭제한다.(참고로 특정 stash를 삭제하려면 stash list 에서 stash의 순번을 다음과 같이 drop 뒤에 입력시켜주면 된다)

 

stash의 순번은 분홍색 네모칸을 의미한다

# 특정 순번의 stash를 자료구조에서 완전 삭제하기
git stash drop stash@{0}

 

참고로 백업해놓은 stash를 복원시키면서 동시에 stash list 자료구조에서 해당 stash를 삭제하려면 pop 명령어를 사용해주면 된다.

 

# 특정 stash를 복원하면서 해당 stash를 자료구조에서 삭제를 동시에 수행
# 특정 stash 명시 안해줄 시 가장 먼저 백업되었던 stash를 복원시키면서 자료구조에서 삭제
git stash pop stash@{0}

 

반응형