[git stash]- 사용법, 로그 안보이게 하기, 삭제한 stash 복구하기

강병철·2022년 9월 30일
1

간단하고 유용한 기능!

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 명령어

그럼 이제 stash 관련 명령어들을 알아보자

git stash
untracked를 제외한 모든 작업내역 파일들을 임시저장 해두고 작업내역을 비운다

git stash -u
untracked까지 포함해서 stash 한다

git stash --staged
staged(add) 된 파일들만 stash 한다

현재 수정 내용을 다른 커밋으로 옮길 때 요긴하게 사용한다
(옮길 내역을 커밋 하고 cherry-pick을 사용하는 방식을 써도 되지만, 불필요한 커밋을 만들지 않아도 돼서 더 편한 것 같다)

git stash list
stash 목록을 확인한다

  • stash@{번호}: 커밋Hash "커밋메시지"
    여기서 중괄호에 표기된 번호를 아래에 소개되는 명령어들 뒤에 추가하면 작업할 stash를 지정할 수 있다.
    ex: 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의 파일 변경 내역을 상세히 보여준다 (어느 라인에 뭘 추가했고..등등)

apply/pop 했을 때 error

  • stash가 꺼내지지 않는 에러

충돌이 되는 파일들이 unstaged 상태에 있는 경우 해당 에러가 발생하는 것 같다

이 경우 에러 메세지대로 현재 작업 내역을 commit을 하거나, stash로 치운 다음에 다시 시도해도 되지만
그냥 현재 작업 내역 중 문제가 되는 파일들을 git add 한 뒤에 다시 시도하면 stash가 적용된다

물론! 그 후에 conflict는 해결해줘야한다!

삭제한 stash 복구하기

아직 필요한 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를 해두고 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 여기를 참고하자


0개의 댓글