git stash 자세히 살펴보기

안녕하세요?

오늘은 git 명령어 중에 stash에 대해 알아보겠습니다.

stash라는 영어 뜻은 숨겨둔 장소, 숨겨둔 것이라는 뜻이 있는데요.

코딩을 하다가 커밋하기는 좀 그렇고 임시적으로 테스트해볼 경우가 필요한데,

그렇다고 branch까지 만들어서 하기가 귀찮을 때 stash를 만들면 커밋 없이 아주 쉽게 원상 복구할 수 있습니다.

실전 git stash

git stash 명령어의 실전으로 들어가기 위해 빈 디렉터리에 git 폴더를 만듭시다.

mycodings.fly.dev-how-to-git-stash-command

위 그림과 같이 만들었으면 이제 빈 파일을 추가해서 커밋 몇 개 해 보겠습니다.

mycodings.fly.dev-how-to-git-stash-command

git status 상태를 보면 untracked files가 두 개 있다고 나오는데요.

git stash 명령어를 사용하려면 untracked 상태에서는 사용할 수 없습니다.

그래서 아래 명령어로 untracked files를 스테이징 해야 합니다.

git add --all

mycodings.fly.dev-how-to-git-stash-command

그리고 첫 번째 commit을 해야지 git stash를 사용할 수 있습니다.

git commit -m "initial commit"

mycodings.fly.dev-how-to-git-stash-command

이제 git stash를 사용할 수 있는 상태가 되었는데요.

테스트를 위해 file1의 내용을 수정해 보겠습니다.

echo "test1111" >> file1
cat file1
test1111

mycodings.fly.dev-how-to-git-stash-command

이제 다시 git status 상태를 볼까요?

당연히 file1 파일의 내용이 바뀌었다고 나올 겁니다.

mycodings.fly.dev-how-to-git-stash-command

이 상태에서 git commit을 하던가 아니면 git stash를 할 수 있는데요.

약간 테스트를 위한 코드라고 생각한다면 git stash를 이용해서 코드를 숨겨둘 수 있습니다.

git stash 명령어는 아래와 같이 두 가지로 실행할 수 있는데요.

git stash

또는 

git stash push -m "initial stash push"

꼭 두 번째 방법을 사용하시라고 권하고 싶습니다.

첫 번째 방법인, git stash를 만들면 현재 커밋된 정보를 가지고 stash 정보를 보여주는데요.

아래 그림처럼 헷갈립니다.

mycodings.fly.dev-how-to-git-stash-command

아래는 'git stash list' 명령어를 치면 나오는 화면입니다.

mycodings.fly.dev-how-to-git-stash-command

그래서 꼭 두 번째 방법을 사용하여 commit 할 때와 같이 주석을 달아 주는 게 좋습니다.

mycodings.fly.dev-how-to-git-stash-command

아래 사진처럼 'git stash list' 명령어를 쳐도 우리가 주석을 달았던 내용대로 stash 리스트가 나오고 있어 나중에 구분하기가 쉽습니다.

mycodings.fly.dev-how-to-git-stash-command

그런데 잘 보시면 아래 사진처럼 git stash 하고 난 다음 git status 명령어로 git 상태를 보면 아까 우리가 수정했던 file1 파일의 변경됐던 사항이 없어졌습니다.

mycodings.fly.dev-how-to-git-stash-command

바로 git stash 명령어로 아까 변경된 사항이 stash 즉, 숨겨둔 곳으로 이동됐다는 뜻입니다.

file1 파일을 열어봐도 아무것도 없다고 나올 겁니다.

이제 두 번째로 file2 파일을 수정해 볼까요?

echo "test2222" >> file2
cat file2
test2222

이제 다시 git status를 쳐보면 file2가 변경됐다고 나올 겁니다.

mycodings.fly.dev-how-to-git-stash-command

git stash list 명령어로 stash 리스트를 확인해 볼까요?

mycodings.fly.dev-how-to-git-stash-command

stash@0, stash@1처럼 인덱스 넘버가 우리가 알아보기 쉽게 나오고 있습니다.

그럼, git stash 명령어를 두 개 한 후의 file1, file2의 내용은 어떻게 될까요?

아래 그림처럼 아무 내용이 없습니다.

왜냐하면 file1, file2 각각의 파일을 수정했을 때마다 git stash로 숨겨두었기 때문입니다.

mycodings.fly.dev-how-to-git-stash-command

위 사진에서 보듯이 파일 내용이 아무것도 없습니다.

git stash 적용하기

그럼, git stash 한 걸 다시 코드에 적용해 볼까요?

git stash를 현재 코드에 적용하는 명령어는 다음과 같이 두 가지가 있습니다.

git stash apply
또는
git stash pop

git stash apply <index>
또는
git stash pop <index>

apply와 pop의 차이는 pop의 경우 해당 stash를 현재 상태에 적용하는데 stash 한 걸 지우고, apply는 지우지 않는다는 차이가 있습니다.

mycodings.fly.dev-how-to-git-stash-command

위 그림과 같이 stash 1번을 apply 했을 때 해당 내용인 file1 파일의 내용이 다시 돌아왔습니다.

mycodings.fly.dev-how-to-git-stash-command

apply 명령어를 적용했기 때문에 위와 같이 git stash list에 해당 stash가 그대로 남아 있습니다.

그럼 git stash pop 명령어를 적용해 볼까요?

mycodings.fly.dev-how-to-git-stash-command

그리고 stash list를 볼까요?

mycodings.fly.dev-how-to-git-stash-command

위 그림처럼 pop을 이용해서 stash를 현상태로 되돌릴 때 pop은 해당 stash를 지우게 됩니다.

참고로, apply랑 pop을 이용해서 stash를 복원했을 때는 git conflict가 발생할 수 있습니다.

이 때는 수작업으로 충돌되는 부분을 꼭 고쳐줘야 합니다.

git stash 삭제

마지막으로 stash를 지우는 방법에 대해 알아보겠습니다.

다음과 같이 해당 stash를 지울 수 있고 전체 stash를 지울 수 있습니다.

git stash drop <index>

위와 같이 하면 해당 인덱스의 stash를 지울 수 있고

git stash clear

위와 같이 입력하면 stash 전체를 지우게 됩니다.

지금까지 git stash에 대해 알아보았는데요.

git stash 기능은 git 명령어 중에 아주 유용한 기능이니 꼭 익혀두시기 바랍니다.

그럼.