간단하고 유용한 기능!
stash
명령은 git status
했을 때 보이는 파일들을 저장하고 치워주는 기능이다
git status
의 결과가 아래와 같은 상태일 때
git stash
를 하면 Staged, Unstaged 파일들이 사라진다 ↓
(만약 Untracked 상태인 1.md
같은 파일도 같이 stash 하고 싶다면 git stash -u
를 사용하면 된다)
stash된 작업 내역은 git stash list
를 통해 확인할 수 있다
그러면 이제 HEAD를 다른 브랜치로 마음껏 옮겨다니다가, 다시 원래의 커밋으로 돌아와서 stash 해놓은 파일들을 git stash apply
를 이용해 꺼내면 된다 (꼭 같은 커밋이 아니여도 되지만, 충돌이 날 수 있다)
그럼 이제 stash 관련 명령어들을 알아보자
git stash
untracked를 제외한 모든 작업내역 파일들을 임시저장 해두고 작업내역을 비운다
git stash -u
untracked까지 포함해서 stash 한다
git stash --staged
staged(add) 된 파일들만 stash 한다
현재 수정 내용을 다른 커밋으로 옮길 때 요긴하게 사용한다
(옮길 내역을 커밋 하고 cherry-pick을 사용하는 방식을 써도 되지만, 불필요한 커밋을 만들지 않아도 돼서 더 편한 것 같다)
git stash list
stash 목록을 확인한다
stash@{번호}: 커밋Hash "커밋메시지"
git stash pop 2
== stash@{2}을 pop 한다,git stash show -p 3
== stash@{3}의 파일 수정 내용을 조회한다git stash apply
가장 최근 stash(번호 0)를 꺼내되 list에서 지우진 않는다
git stash pop
가장 최근 stash를 꺼내고 list에서 지운다
git stash drop
가장 최근 stash를 삭제한다. (삭제했더라도 해쉬값을 이용해 복구할 수 있다!)
git stash show -p
가장 최근 stash의 파일 변경 내역을 상세히 보여준다 (어느 라인에 뭘 추가했고..등등)
충돌이 되는 파일들이 unstaged 상태에 있는 경우 해당 에러가 발생하는 것 같다
이 경우 에러 메세지대로 현재 작업 내역을 commit을 하거나, stash로 치운 다음에 다시 시도해도 되지만
그냥 현재 작업 내역 중 문제가 되는 파일들을 git add
한 뒤에 다시 시도하면 stash가 적용된다
물론! 그 후에 conflict는 해결해줘야한다!
아직 필요한 stash를 실수로 drop하여 삭제해버린 경우, 해당 stash의 해시값을 알고 있으면
git stash apply 해시값
을 이용해 다시 꺼내거나
git stash show -p 해시값
을 이용해 해당 stash의 작업 내역들이 어떤게 있었는지 확인 할 수 있다.
하지만 만약 drop을 했는데 터미널을 꺼버려서 내역을 못찾거나, stash clear
로 전부 삭제해버린 경우에는 갓오버플로우를 참고하자 https://stackoverflow.com/a/91795/17365237
stash를 해두고 git log
에 --all
옵션을 붙이는 경우, stash 내역이 커밋로그에 나타나서 로그가 지저분해진다
Head 이후에는 커밋이 없이 stash만 한 상태인데 저렇게 stash commit이 너저분하게 붙어있다.
이 경우 git log ~~ --all ~~
명령어에 --exclude=refs/stash
를 추가해주면 된다
--all
보다 앞에(왼쪽에) 추가해줘야한다--all --exclude =refs/stash
❌--exclude=refs/stash --all
⭕️위 로그는 내가 git alias로 등록해놓은 명령어를 사용하여 로그를 출력한 것이다.
git alias가 궁금하다면 https://goddaehee.tistory.com/273 여기를 참고하자