본문 바로가기

깃 브랜치 (git branch) 6. stash

만약


브랜치의 작업이 다 끝나지 않았는데, 다른 브랜치로 급히 이동(checkout) 해야할 경우는 어떻게 해야 할까?

작업을 완료(commit)하지 않으면 다른 브랜치로 이동(checkout)을 할 수 없는데.... 

'임시저장' 같은 기능이 있다면 참 편할텐데...


이럴 때 할 수 있는 방법은?



바로 'stash'


stash : 의미) 감추다. 숨겨두다.


stash를 이용한다면, 현재 진행 중인 작업을 잠시 숨겨두고, 가장 최신 commit 상태에서 다른 브랜치로 이동(checkout) 할 수 있다.


브랜치를 활발하게 사용한다면 굉장히 유용한 기능이다.



예제 :


stash를 통해 현, 브랜치의 현 상태 저장하기(숨기기)

stash save / apply / list / drop


해보기


브랜치 master, exp가 있다.


exp에서 같은 이름의 파일 f1.txt을 수정 중, 

갑작스러운 일이 생겨 master로 이동해야 한다.


이때, commit을 하지않고.. master로 이동한다면?

exp에서 수정 중이던 f1.txt가 master에도 영향을 주게 된다.


이럴 때 어떻게 하면 좋을까?

-> git stash save  ( 'save' 생략가능)

stash 명령어를 내리면 현 작업중인 내용은 따로 저장되서 숨겨두고 가장 최근의 commit 상태에서 다른 작업이 가능하다.


이 상태에서 'checkout master'로 마스터로 이동, 원하는 작업을 한 후 다시 exp로 돌아와


-> git stash apply 

: 명령어를 통해 아까 작업을 불러 올 수 있다.

-> git stash list

: stash의 리스트를 볼 수 있다.


여기서 잠깐! 

-> git reset --hard head

: 가장 최신 commit 상태로 돌려 놓음 (현 작업을 지우는 작업! 조심!)

reset을 통해 현 작업을 삭제한다면 stash는 어떻게 될까?


-> git stash apply / git stash list

: reset아까 저장한 stash를 불러 올 수도, list를 볼 수 있다.


즉, stash는 'git stash drop'이라는 명령이 있기 전 까지 지워지지 않는다.

-> git stash drop

: stash에서 가장 최신 stash를 삭제

-> git stash apply; git stash drop;

= git stash pop

: stash 적용 후, stash 삭제 (한 번에 명령 전달. ㅎ 이것이 커맨드라인의 장점)


* 주의)
단, git stash는 최소한 버전관리가 되고 있는 파일에 한해서만 stash가 가능하다.





git add f1.txt



브랜치 exp를 만들고 이동한다.



f1.txt를 편집한다.


편집


commit을 못하고.. master로 이동해보자.


여기서 상태를 확인해보면

f1.txt가 변경되었다고 나와있다.



exp로 이동해도 역시 같이... f1.txt가 변경되었다고 나온다.




git stash --help


stash의 매뉴얼을 볼 수있다



git stash save

('save'는 생략가능)


자 다시 상태를 보면 상태가 깨끗하게 되어있다. ㅎ



git stash apply를 통해 stash를 불러 올 수 있다.

다시 상태를 보면, f1.txt가 변경되었다고 나온다.




git stash list 


status의 리스트를 볼 수 있다.




자, 최신 commit으로 돌아가 보자. (현 작업 상태가 지워지게 됨 주의!)




git stash list


현, 브랜치의 stash의 list를 볼 수 있다




아까 stash 해놓은 것을 다시 불러와보자.

git stash apply



add / commit 하지 않은 f1.txt 를 다시 볼 수 있다.



자 여기서 현재 작업을 저장하지 않고 reset으로 날려버린다면?!


그리고 다시 stash apply 한다면?




reset을 했지만 stash는 살아있는 것을 확인 할 수 있다.





자 이번엔, f2.txt를 추가해보자.


commit 하기 전, stash에 저장



git stash list를 보면 두 개의 list 목록을 볼 수 있다.



git stash apply

를 한다면 가장 최근의 stash를 가져오는 것을 확인 할 수 있다.




여기서

git stash drop으로 최근 stash를 삭제할 수 있다.



git stash list를 통해 목록을 볼 수 있다.




이렇게...

branch 작업 중(완료해서 commit 하기 전) 다른 branch로 이동해야 할 경우가 생길 때,

현 작업 상황을 'stash'에 저장 후 이동할 수 있다.


작업을 마친 후, branch로 돌아 온 후, stash에 저장되어있는 작업을 불러와 이어서 진행할 수 있다.