이번 시간에는 stash
에 대해 알아보겠습니다.
stash
는 감추다 , 숨겨두다 라는 뜻을 가지고 있습니다.
이는 branch
를 활발하게 작업하던 도중에 현재 branch
에서 작업을 마무리 하지 않았는데 , checkout
을 해서 다른일을 해야하는 경우가 있습니다.
이때 commit
을 하지않으면 checkout
을 할 수 없기 때문에
stash
를 통해 해결 가능합니다.
master
에서 f11.txt
파일을 새로 만들어 보겠습니다.
add
와 commit
도 해줍니다.
git checkout -b exp
를 통해 checkout
과 git branch exp
를 동시에 해줍니다.
이후 f11.txt
파일을 수정해줍니다.
이때 만약 일이 생겨서 checkout
을 해야한다는 상황이 온다면 어떻게 해야할까요?
이때 만약 바로 git checkout master
를 실행시 git status
를 실행하면 아까 수정한 f11.txt
의 내용이 master
에도 영향을 끼칩니다.
즉 master
에서도 exp
에서 바꾼 파일의 내용이 적용이 된다는 것입니다.
하지만 우리는 exp
에서 작업을 하던 도중에 급한 일이 생겨 master
로 이동할려는 것이지 , master
에까지 exp
에서 수정한 내용을 옮기는 것은 원하지 않았습니다.
이후 git checkout exp
를 통해 이동한 후에 git stash --help
를 통해 옵션을 확인 해줍니다.
git stash
를 사용해줍니다. save
옵션을 쓰셔도 무방합니다.
이후 git status
실행시 commit
할 파일이 없다고 뜹니다.
cat f11.txt
실행시 아까 수정했던 내용은 없고 기존의 내용만 그대로 남아있는 모습입니다.
또한 master
에서도 아무론 영향을 끼지치 않았습니다.
이후 git checkout exp
로 이동해준 후에 git stash apply
를 통해서 복원해줍니다. 이때 f11.txt
의 파일내용을 보면 이전에 변경했던 내용으로 출력되는 것을 확인 할 수 있습니다.
또는 git reset --hard HEAD
를 통해 가장 최근에 commit
한 내용을 삭제해주면 git status
실행시 commit
할 파일이 없다고 출력됩니다.
하지만 이 또한 git stash apply
를 통해 복원 가능합니다.
즉 stash
는 명시적으로 삭제를 하지 않는 이상은 이전에 저장한 내용이 계속 남아있다는 뜻입니다.
이후 한번더 git reset --hrad
를 실행하고
f12.txt
라는 새로운 파일을 만듭니다. 파일내용에는 a
만 넣었습니다.
이때 f12.txt
파일을 add
만 하고 stash
를 하겠습니다.
이때 git stash list
를 실행하면 가장 위에있는 stash
를 적용합니다. 만약에 가장 최근의 stash
말고 그 이전의 stash
를 적용할려면 어떻게 해야할까요?
git stash drop
를 통해 가장 최근의 stash
를 삭제할 수 있습니다.
또한 git stash apply ; git stash drop;
를 통해 명령을 동시에 수행할 수 있습니다. 이는 이전의 stash
를 적용시키고 , 가장 최근의 stash
를 삭제해라는 의미입니다.
또는 git stash pop
을 실행해도 됩니다.
git stash --help
를 통해 내용을 보면 git-stash - Stash the changes in a dirty working directory away
라고 적혀있습니다.
이때 유심히 봐야 할 점은 working directory
에 있는 파일만 적용한다는 접입니다.
f13.txt
를 새로만들고 add
하지 않은 상태에서 git status
실행시 f13.txt
는 Untracked files
라고 뜹니다. 즉 추적되고있지 않은 파일입니다.
따라서 git stash
를 실행해도 f13.txt
는 적용되지 않습니다.
따라서 stash
는 최소한 버전관리가 되고있는 파일에 한해서만 적용이 됩니다.