git stash - 변경 내역 임시 저장하기

업데이트:

:( Trouble

기능 개발을 하다가 정신을 차려보니 아차! 마스터 브랜치(master branch)에서 하고 있었다. 개발 브랜치(dev branch)에서 해야하는데.. 여태 했던 작업들을 버릴 수도 없고..

:0 Think

현재까지 했던 작업을 잠시 다른곳에 저장해두고 브랜치를 옮긴다음에 다시 불러오면 되지 않을까??

:D Solution

git의 책갈피 기능인 stash 명령어를 사용하면 현재의 변경사항을 그대로 다른 브랜치에 옮길 수 있었다.

변경 사항 임시 저장 : stash

step 1. git stash

하던 것 임시 저장하기

1
2
$ git stash
Saved working directory and index state WIP on master: ~
원하는 이름 부여하기
git stash save TEMP : TEMP라는 이름을 부여한다.
WIP (Work in Progress)
아직 진행중이라는 의미이다. 커밋 메시지에 딱히 쓸 말이 없을 때 유용하게 사용하면 된다.

step 2. git status

확인을 해보면 Working Directory가 깨끗한 것을 볼 수 있다.

1
2
3
4
$ git status
현재 브랜치 master
브랜치가 'origin/master'에 맞게 업데이트된 상태입니다.
커밋할 사항 없음, 작업 폴더 깨끗함

step 3. git stash list

잘 들어갔는지 확인

1
2
3
4
$ git stash list
--- shell ---
stash@{0}: WIP on master: ~
(END)

변경 사항 불러오기 : Unstash

case 1. 마지막 작업본 가져오기

1
2
3
4
5
$ git stash pop
현재 브랜치 feature/#8
...
# 불러옴과 동시에 제거됨
Dropped refs/stash@{0} (9e6791f2553aeb01db82c7b7c2d45da018805f2d)

stash에 저장되어있던 작업이 pop되면서 제거된다.

case 2. 특정 작업본 가져오기

git stash list 명령어를 통해 불러올 작업 확인

1
2
3
$ git stash apply stash@{0}
현재 브랜치 feature/#8
...

apply 명령어는 pop 과는 다르게 stash list에서 제거되지 않는다.

list 삭제 방법

  • git stash drop : 필요 없는 stash를 제거

  • git stash clear : 전체 stash list 삭제

  • git stash save : 현 작업을 저장해두고 브랜치를 head로 돌린다. (git reset –hard)

stash 활용기

stash 기능을 익히고 나서는 이전보다 훨씬 유연한 작업을 할 수 있게 되었다. 현재 작업을 다른 브랜치로 옮기는 것 뿐만 아니라 push를 할 때 생기는 충돌도 가볍게 해결할 수 있었다.

프로젝트를 하다가 변경사항이 생기면 그것을 pull ( = fetch + merge ) 해야한다. 그렇지 않으면 다른 사람이 변경한 내용과 내가 로컬에서 작업한 내용의 불일치로 인한 충돌이 발생해서 정상적으로 push 하지 못하는 상황이 만들어진다. 이럴 때 stash 기능이 진가를 발휘한다!

어떻게 해결했는가?

1
2
3
4
5
6
7
$ git stash                     # 하던 작업을 잠시 다른 곳에 두고
$ git reset --hard HEAD^        # 충돌이 발생하기 전으로 깨끗하게 되돌린다. 
$ git pull origin master        # 현재 브랜치를 업데이트한 뒤에 (필요시 -f 옵션으로 강제 pull)
$ git stash pop                 # 아까 작업했던 내역을 불러와서
$ git add .
$ git commit -m "message"
$ git push origin dev           # push하면 깔끔하게 된다.

태그: ,

카테고리:

업데이트: