What is stash?
이런 상황을 생각해 보자. A는 열심히 working directory에서 코드를 수정하고 있다. 그런데 B가 다른 브랜치에서 생긴 bug를 확인해 달라고 요청한다. ✨이 때 A가 지금까지 수정한 내용을 commit하지 않고 다른 branch로 checkout하면 예기치 못한 문제가 생긴다.✨ 예를 들어 feature라는 브랜치에서 수정한 파일을 commit하지 않은 상태로 master로 이동하면, feature에서 작업중인 내용이 master의 status에 영향을 끼치게 된다.
물론 commit을 한 뒤에 다른 branch로 이동할 수도 있지만, A는 아직 수정 중인 사항을 commit할 준비가 되지 않았다. 이럴 때 쓸 수 있는 명령어가 "stash"이다. stash를 이용하면 commit 하지 않고 다른 branch로 이동했을 때 위에서 언급한 예기치 못한 문제가 생기는 것을 막을 수 있다.
stash는 내가 수정 중인 내용들을 우리가 보지 못하는 어느 장소에 모두 저장한다. 즉 현재 브랜치에서 변경된 사항이 없는 상태(현재 브랜치가 깔끔해진 상태)가 되기 때문에, 다른 branch로 문제없이 checkout하는 것이 가능하다. 물론 원래 branch로 다시 돌아왔을 때, stash stack에 저장된 내용을 불러올 수도 있다.
The git stash command takes your uncommitted changes (both staged and unstaged but only tracked), saves them away for later use, and then reverts them from your working copy.
=> stash 명령어는 commit 하지 않은 변경사항을 복사본 형태로 stash stack에 저장한다. 나중에 이 복사본을 다시 불러와서 작업할 수 있다.
git stash push actually means "Commit all the changes, but on no branch at all, then remove them from where I am now." That makes it possible to switch: you now have no in-progress changes. You can then git stash apply them after switching.
Stashing is handy if you need to quickly switch context and work on something else, but you're mid-way through a code change and aren't quite ready to commit.
Stash basic
위의 그림에서, 변경 사항이 모두 stash에 저장되었기 때문에 working dir와 staging area가 깨끗하게 정리된 것을 볼 수 있다. 즉, 변경 사항이 없어졌기 때문에 다른 branch로 이동할 수 있다!
만약 다시 한번 파일을 수정하면 어떻게 될까? 파일을 수정한 뒤에 status를 확인해 보면, staging area에 없는 파일(about.txt)이 수정되었다는 도움말이 출력된다. add .을 이용해서 파일을 staging area로 옮긴 뒤에 다시 status를 확인해 보면 staging area에 있는 파일이 수정되었음을 알려주는 도움말이 출력된다.
git stash | Saved working directory and index state WIP on 현재 브랜치: 해쉬코드
git stash -m "first work"
- git stash push와 똑같다.
- WIP: Working in process, 작업중
- 해당 브랜치의 stash 커밋에, working dir와 WIP state인 staging area가 저장되었다는 뜻인데, 터미널에서 실험해 본 결과(?) stage에 추가해 둔 파일의 상태가 working dir에 있는 것과 같은 상태로 stash stack에 저장된다.
- 그래서 stash에 저장해 둔 상태를 다시 불러왔을 때, staging area에 저장해 둔 파일의 상태가 Changes to be committed가 아니라 Changes not staged for commit임을 확인할 수 있다.
- stash 후에 status를 확인해 보면, 아무것도 커밋할 것이 없다는 문구가 출력된다.
- 내가 변경한 사항들을 숨겨진 커밋에 저장하고, 현재 커밋을 깔끔하게 지운 상태가 된 것이다.
- 즉, stash 후에 현재 브랜치에서 수정된 파일의 내용을 다시 살펴보면, 내가 변경한 내용은 포함되어있지 않은 것을 확인할 수 있다.
- 다시 apply를 통해 저장된 내용을 꺼내오면, 내가 변경한 내용들이 현재 브랜치? head? 에 포함되는 것을 볼 수 있다.
- stash에 저장된 내용은 git reset --hard 후에도 지워지지 않고 남아있다.
git stash push -u | untracked filed을, 한번도 add한 적 없는 새롭게 만들어진 파일, stash stack에 포함한다.
keep-index 옵션을 이용하면, 현재 staging area에 있는 것을 유지하면서 stash할 수 있다.
git stash -m "first work" --keep-index
- --keep-index 옵션 | "All changes already added to the index are left intact"
- 이 옵션을 사용하지 않고 stash 한 뒤에 git status를 확인해 보면 "nothing to commit, working tree clean"을 출력한다. 그러나 이 옵션을 사용하면 "changes to be commited" 도움말, 즉 add 명령어를 이용해 stage에 추가한 파일 목록을 보여준다.
- 즉, stage에 추가된 파일들은 그대로 stash stack에 저장되는 것이 아니라, staging area에 남아있다.
- 이 상태로 다른 branch로 checkout하면 overwrite 될 수 있다는 경고가 출력된다. 즉 현재 branch의 stage에 있는 파일이 이동할 branch의 stage에도 기록된다.
git stash apply stash@{n} | 저장되어 있는 stash를 working directory로 불러온다. 아이디를 생략하면 가장 마지막에 push한 stash를 불러온다(LIFO).
git stash list | stack에 저장되어 있는 전체 stash 확인
git stash drop stash@{n} | 아이디에 해당하는 stash를 목록에서 삭제한다.
git stash pop | 가장 마지막에 push한 stash를 working directory에 가져오면서 stack에서 삭제한다(apply + drop).
git stash clear | 전체 stash를 삭제한다.
git stash show stash@{n} | stash에 저장된 파일의 변경 상태를 확인할 수 있다. -p 옵션을 이용하면 자세히 확인 가능
git stash branch 브랜치이름 | stash에 저장된 상태를 새로운 branch로 불러올 수 있다.
'Study > Git & Github' 카테고리의 다른 글
Remote (0) | 2022.04.15 |
---|---|
Undo (0) | 2022.04.14 |
Branch & Merge (0) | 2022.04.11 |
Basic (0) | 2022.04.11 |
over view (0) | 2022.04.11 |