Git - Stash 활용법

rebase를 다루다보면, stash 기능이 필요할 때가 있다. stash는 현재 staging된 파일들이 있는 status를 잠시 저장할 때 사용하는 명령어이다. 아래의 예제를 보면서 이해해보자.

git init

저장소를 만들어서 a부터 d까지 이름을 각각 갖는 txt 포맷의 파일 4개를 생성했다. 그리고 a.txt만 staging 해두었다.

1
2
$ git add a.txt
$ git status

현재의 상태는 다음 그림과 같다.

Git은 stage에 있는 파일만 버전관리를 하기 때문에 stage 바깥에 있는, 즉 아직 staging하지 않은 파일들은 추적되지 않는다. 따라서 따라서 rebase처럼 stage가 비워져있어야지만 진행할수 있는 상황에서는 현재처럼 staging된 파일이 있을 경우 다음으로 진행할 수가 없다.

이 때 stash를 사용하면 stage에 있는 파일들을 다른 임시 저장소로 옮겨두고, stage를 비울수 있다.


git stash

현재 예제로 작성한 저장소가 커밋이 없는 관계로 stage에 있는 a.txt를 커밋하고, 이번엔 b.txt를 staging하고 stash로 저장해보겠다.

1
2
3
$ git commit -m "add a"
$ git add b.txt
$ git stash


git stash list

커밋을 하지 않았음에도 status에서 b.txt가 보이지 않는다. 성공적으로 임시저장소에 저장한것이다. 그럼 임시저장소에 저장된 b.txt는 어떻게 볼 수 있을까?

1
2
$ git stash list
$ git stash show

stash 명령어의 list 옵션으로 임시저장소에 저장된 stash 리스트를 출력할 수 있다. 그리고 show 옵션으로 해당 stash에 어떤 파일이 담겨있는지도 자세히 볼 수 있다.

그럼 이 stash list에 하나 더 추가해보겠다. c.txt로 staging하고 stash로 저장했다.

1
2
3
4
$ git add c.txt
$ git stash
$ git status
$ git log

git stash show

이렇게 stash list에 두개의 stash가 생성된 것이 보인다.

1
2
stash@{0}: WIP on master: 205a72d add a
stash@{1} : WIP on master: 205a72d add a

add a라는 커밋메세지를 갖고있는 커밋(205a72d)를 바라보는 stash들임을 알 수 있으며, 인덱스 갖고잇음으로 이들을 서로 구분할 수 있다. 따라서 각각의 stash에서 어떤 상태를 저장했는지를 보고자 한다면, stash의 인덱스와 함께 show 옵션을 명령하면 조회할 수 있는 것이다.

새로 추가된 stash의 인덱스가 0이며, 오래될수록 인덱스 번호가 증가하는 방식이다. 따라서 첫 stash를 조회하기 위해선 현재 상태에서 인덱스 1의 stash를 조회해야 한다.

1
$ git shash show 1

git stash pop

이제 다시 돌아가서 b.txt를 커밋하고자 하면, 어떻게 해야할까?

저장해둔 stash를 다시 꺼내야 할 것이다. 이 때 사용하는 옵션 명령어가 pop이다.

1
$ git stash pop 1

이외에도 stash 명령어의 clear 옵션으로 stash를 비울수도 있지만, 위험해보이는 옵션명령어 같아서 앞으로 얼마나 쓸 일이 있을지 모르겠다. clear 명령을 하면 당시 staging되었던 파일이 아예 사라진다.

1
$ git stash clear

이상 git stash 명령어 정리 끝!