git에서는 특정 브랜치를에서 작업 중 갑자기 타 브랜치로 옮겨야 하는 경우가 종종 있다(자주 있는거 같기도 하다)
이럴 때 stash를 사용하지 않는다면 커밋을 하고 타 브랜치로 옮겨야 한다.
이때 만약 커밋을 할 타이밍이 아니라면 쓸데없이 커밋 로그가 한줄 쌓일 것이다.
이러한 것이 쌓이다보면 커밋을 보기가 싫어진다.
이럴때 stash를 이용하면 쓸데없는 커밋을 남기지 않고도 타 브랜치를 움직일 수 있다.
$ git checkout -b test # test branch 생성
$ vim test.py # test.py파일 생성
'''코드수정'''
:wq
$ git status
On branch test
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: test
Untracked files:
(use "git add ..." to include in what will be committed)
test.py
no changes added to commit (use "git add" and/or "git commit -a")
(/Users/bagjeongtae/anaconda) bagjeongtaeui-MacBook-Pro:git_test bagjeongtae$
파일을 추가를 하거나 수정을 하고나서 status 명령을 통해 어떤 파일이 생성, 갱신, 삭제가 되었느지 알 수 있다.
문제는 이러한 상태에서는 checkout, pull을 수행 할 수가 없게된다.
위와같은 상태에서 commit이나 pull을 시도할 경우 아래와 같은 현상이 일어날 것이다.
$
git checkout master
error: Your local changes to the following files would be overwritten by checkout:
test.py
Please commit your changes or stash them before you switch branches.
Aborting
로컬에서 파일이 바뀌어 덮어 씌우게 된다. 커밋을 하고 브랜치를 교체하라는 에러를 띄운다.
그럼 여기서 커밋을 해주어야 하는데 이때 stash를 쓰게되면 꼭 커밋을 할 필요가 없다.
필자같은 경우는 이때 commit을 했다가 타 브랜치로 이동을 해서 작업을 하고 다시 원래 브랜치로 돌아와서 reset을 써서 커밋을 지웠었는데
stash를 쓰면 저렇게 할 필요가 없다.
$ git stash
Saved working directory and index state WIP on test: 2fc8bdc test
HEAD is now at 2fc8bdc test
$ git stash list
stash@{0}: WIP on test: 2fc8bdc test
저장이 되면서 해당 브랜치의 HEAD는 clean상태가 된다. clean상태란 가장 최근 커밋 상태를 가리키는 것이다. 그리고 현재의 상태를 stash저장소에 저장을 하게 된다.
$ git checkout master
타 브랜치로 checkout을 하면 정상적으로 checkout이 가능하게 된다.
바꾼 브랜치에서 작업을 하고 다시 test브랜치로 돌아온 후 stash로 저장 한 코드를 다시 불러오자 방법은 몇가지가 있는데
첫번째로 git stash pop을 이용하는 것이다
$ git stash pop
$ git stash show list
pop을 이용 할 경우 stash리스트에서 뺴오면서 해당 데이터를 지워준다.
이건 스택의 push, pop이랑 원리가 같다.
두번째 방법은 apply를 이용하는 것이다.
$ git stash apply
$ git stash show list
stash@{0}: WIP on test: 2fc8bdc test
apply를 사용 할 경우 list에서 해당 정보를 지우지 않는다. 해당 정보를 계속 남기고 싶다면 pop이 아니라 apply를 사용하도록 하자
댓글
댓글 쓰기