본문 바로가기
Infra/GIT&GIT HUB

Git (8) : stash (임시저장)

by jaeaemin 2021. 7. 18.

Stash

 

branch의 작업 내용을 마치지 못하고 다른 branch로 checkout하기 위해서는 현재 작업을 commit해야한다. 

이 때 Stash를 사용하면 이 때까지의 작업 내용을 숨겨둘 수 있다. 

 

Stash는 명시적으로 삭제하지 않는 이상 숨김 처리로 스택에 보관되어진다. 하지만 조건이 있는데, git stash 명령을 사용하기 위해서는 working directory에서 수정한 파일들만 저장가능하다. 즉 untracked되어진 파일들은 저장되지 않는다.

따라서 stash에는 수정되어진 Tracked 파일, 수정되어 staging area에 위치하는 파일 등이 저장된다.

 

작업 임시 저장하기 ( git status or git staus save )

 

현재 f2.txt라는 modified된 untracked파일이 존재한다. 이때 git statsh 명령어를 통해 현재까지의 작업 내용을 stash stack에 저장하고 다시 git status로 상태를 살펴보면 아래와 같이 최근 commit된 상태로 초기화되는 것을 확인 할 수 있다. 

이 이후 다른 branch에서 작업을 위해서 branch를 이동할 수 있다.

 

 

Stash 목록 확인하기  ( git stash list )

 

git stash list 명령어를 통해 출력된 창을 살펴보면 0 , 1 , 2로 시퀀스 형식으로 stash된 상태를 표시하는 것을 확인할 수 있다. 

각 stash마다 텍스트 내용에 2, 3, 4를 추가했다. stash는 stack형식의 저장소이므로 stash{0}에는 가장 최근에 저장된 내용으로 f2.txt에 '4'라는 내용이 추가된 상태고 stash{1}은 '3' stash{2}는 '2'가 저장되어 있다. 이 때 스택에 존재하는 stash@{n}는 명시적으로 삭제하지 않는 이상 존재한다.

 

 

Stash를 통해 임시저장한 내용 복구하기 ( git stash apply )

 

git stash apply를 통해서 임시 저장된 작업을 되돌려보자 ! 

그 후 파일을 살펴보면 가장 최근에 저장된 '4'라는 문자가 추가된 파일로 복구되는 것을 알 수 있다. 즉 stash list에서 stash@{0}번째 작업물로 복귀한 것이다.  

이 때 그 전에 작업한 stash@{1}, stash@{2}로 돌아가기 위해서는 어떻게 해야할까 ? 

1. 순차적으로 작업을 되돌린다면 git stash apply를 순차적으로 실행한다.

2. 명시적으로 작업을 되돌린다면 git stash apply [stash 이름]

 

위의 명령어는 staging에 위치했던 파일을 다시 올려주진 않는다 이때 --index옵션을 이용하여

git stash apply --index 를 사용하면 작업하던 파일과 상황까지 복구할 수 있다.

 

 

 

Stash 삭제하기 ( git stash drop )

 

우리가 apply를 통해서 이전 버전으로 파일을 복귀한다고 해도 stash들은 list에 남아있고 삭제되지 않는다. 

따라서 우리는 Stash를 알맞게 복귀하고 삭제하기 위해서는 명시적으로 삭제해 주어야 한다. 이때 drop명령어를 사용한다. 

 

1. git stash drop   

=> 가장 최근의 즉 스택 맨 위의 stash를 삭제한다

2. git stash drop [stash 이름]  

=> 지정된 stash를 삭제한다

3. git stash pop 

=> stash를 적용하는 동시에 삭제한다

 

 

Stash 적용 취소 ( git stash show -p | git apply -R )

1. git stash shwo -p [stash 이름] | git apply -R  

=> 잘못하여 적용한 Stash에 대한 적용을 취소하고 적용 전으로 돌린다.

 

 

 

plus

 

Git은 HEAD 파일에 branch의 정보를 저장하는데  refs/heads/ [branch이름] 에 새로운 commit이 설정될 떼 마다 생성된 commit file의 객체 id값을 저장하고 그 전의 내용들은 트리 형식으로 파일 속성 값에 저장되게 된다.

따라서 우리가 커맨드창에서 rm .git/refs/heads/ [branch이름] 을 입력하게 되면 brnach가 삭제되게 되는데, 이는 branch란 결국 heads디렉터리내 저장된 텍스트 파일의 일부이기 때문이다.

 

반응형

'Infra > GIT&GIT HUB' 카테고리의 다른 글

Git (10) : reset  (0) 2021.07.22
Git (9) : 병합 충돌 & n way-merge  (0) 2021.07.20
Git (7) : branch & merge  (0) 2021.07.17
Git (6) : branch  (0) 2021.07.12
Git (5) : Reset , Revert 기초  (0) 2021.07.09