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하면 깔끔하게 된다.