4 분 소요

예를 들어 A라는 브랜치에서 작업을 하다가 도중에 다른 브랜치로 가서 작업해야만 하는 상황이 발생했다고 가정해보자. 이 때 A 브랜치에서 스테이지에 올리지도 않은 (또는 커밋되지 않은) 변경점들이 있는 상태에서 다른 브랜치로 이동하려고 하면 우선 현재 변경점들을 커밋하든가 버리든가 한 다음에 이동할 수 있다는 에러가 뜰 것이다. 여기서 현재 작업물들이 완성되지 않아서 커밋하기도 어렵고, 그렇다고 버리기에는 너무 아까운 상황이 있을 것이다. 이럴 때에는 어떻게 해야할까? 필자도 이 상황을 한두번 정도 겪어본적이 있었는데, 그 때는 어떻게 할 지를 몰라서 변경점들이 적은 상황이라 메모장이나 다른 별도의 파일을 만들어 거기에 내용을 복사, 붙여넣기하여 잠시 저장했던 기억이 있다. 하지만 이러한 수동적인 방법도 변경사항이 너무 많다면 사실상 불가능한 일이 될 것이다.

인터넷의 특정 사이트에서 양식을 제출하기 전 다른 일을 해야할 때 그 양식을 “임시 저장”하는 경우를 많이 보았을 것이다. 서버에 제출되진 않지만 임시로 저장이 되어서 나중에 다시 그 사이트를 방문해도 마저 이어 쓸 수 있는 시스템이다. Git에서도 이러한 “임시 저장”과 같은 기능이 존재한다. 이러한 “임시 저장”을 수동적으로 일일히 백업하는 방식으로 하지 않아도 된다. Git에서는 stash라는 편리한 기능을 제공하기 때문이다. 이 기능을 이용하면 현재 커밋되지 않은 변경사항들을 임시로 별도의 공간에 저장한 뒤, 다른 브랜치로 옮겨가 다른 작업을 한 후 다시 본래 브랜치로 돌아와 마저 하던 작업을 이어서 할 수 있게 된다. 이 글에서는 git stash를 사용하는 방법에 대해 다뤄보겠다. 필자가 SourceTree라는 Git GUI에 익숙한 탓에 여기서는 주로 해당 프로그램을 기준으로 설명하겠다.

사진 1-1. 스태시를 이용하려는 모습.

사진 1-1. 스태시를 이용하려는 모습.

필자가 실제로 마주한 상황은 위 모습과 같다. 필자는 refactor/code-refactor 라는 브랜치에서 작업을 하다가 해당 작업이 생각보다 복잡해서 잘못하면 성공적으로 마칠 수 없을지도 모른다는 생각이 든 상태였다. 그래서 필자는 일단 현재 하던 작업은 중단하고, 그 전에 해당 브랜치에 있었던 커밋 이력들을 Github에 push하여 develop 브랜치에 merge하려고 하였다. refactor/code-refactor 브랜치에는 그 이전에 2개 정도의 커밋이 이미 있는 상태였는데, 이 커밋들은 develop으로 합쳐도 되는 상태였다. 필자는 현재 하고 있는 세 번째 작업까지 완료한 후에 develop에 올릴려 했으나 현재 작업이 무산될 수도 있다는 생각이 든 것이다.

이 상황에서 필자는 현재 변경사항들을 “임시 저장”하기 위해 위 사진에서 보이듯, SourceTree 화면 상단 메뉴에 “스태시” 버튼을 클릭하였다. 그러면 위 사진처럼 자그만한 창이 뜬다. 여기서는 해당 스태시에 대한 설명을 메시지로 적는다. 그리고 추적되지 않은 파일, 즉 새로 생긴 파일들도 스태시에 저장하고자 한다면 “추적하지 않는 파일” 체크란에 체크하면 된다. 그리고 “확인” 버튼을 누르면 해당 작업사항이 스태시 목록에 저장되는 것이다. 이렇게 하면 현재 작업 디렉토리에서는 변경 사항들이 모두 사라진다. 물론 위 사진 1-1에서 “스테이지에 있는 변경사항 유지”에 체크한다면 그대로 유지될 것이다.

참고로 여기까지의 상황을 터미널에서 진행하고자 한다면 다음의 명령어들을 이용하면 된다.

# 현재 변경 사항을 바로 스태시로 저장하기
# 단 이 명령어는 추적 중인 파일에만 적용된다. 
git stash

# 만약 메시지까지 남기고자 하는 경우
# 원래는 save였으나 이후 push 명령어로 대체되었다고 함.
git stash push "메시지"

# 만약 추적되지 않은 파일까지도 스태시하고자 한다면 -u 또는 --include-untracked 옵션을 추가한다.
git stash -u

# 만약 stage에 올린 파일들은 stash하고 싶지 않다면 --keep-index 옵션을 추가한다.
git stash --keep-index

코드 1-1.

사진 1-2. 스태시 목록

사진 1-2. 스태시 목록

SourceTree 화면 왼편에 존재하는 사이드바에는 아래에 “스태시”라는 목록이 있다. 여기서 여태까지 저장된 스태시들을 목록으로 볼 수 있는 것이다. 위 사진에서는 방금 저장한 스태시도 0번째 인덱스로 목록에 보이고 있다.

여기까지 왔다면 앞서 말했듯 현재 작업 디렉토리에는 아까는 있었던 변경사항들이 모두 사라져 있다. 따라서 이 상태에서 다른 브랜치로 이동할 수 있는 것이다.

필자는 이 상태에서 refactor/code-refactor 를 Github 원격 저장소에 push하여 develop 브랜치에 merge한 후, 이를 로컬 저장소에서 develop 브랜치에서 pull하여 최신사항을 업데이트하였다. 그리고 refactor/code-refactor 브랜치는 일회용 브랜치이기에 삭제를 하였다. 그리고 develop 브랜치로부터 새로운 일회용 브랜치인 refactor/reduce-overlapped-codes 라는 브랜치를 새로 생성하여 이 브랜치로 체크아웃하였다. 이제 이 브랜치에서 앞서 저장한 스태시를 가져와 마저 작업할 것이다.

사진 1-3. 새 브랜치에서 앞서 저장한 스태시 적용하기

사진 1-3. 새 브랜치에서 앞서 저장한 스태시 적용하기

그러면 위 사진 1-3과 같이 “스태시” 목록에서 가져오고자 하는 스태시를 골라 마우스 우클릭 후, “~ 스태시 적용” 버튼을 누르면 된다. 그러면 다음과 같이 새 브랜치에서 앞서 저장한 스태시가 무사히 적용된다.

사진 1-4. 새 브랜치에 이전에 저장해둔 스태시를 적용한 결과. 변경 사항들이 unstaged 상태에 놓이게 된다.

사진 1-4. 새 브랜치에 이전에 저장해둔 스태시를 적용한 결과. 변경 사항들이 unstaged 상태에 놓이게 된다.

사진 1-5. 새 브랜치에서 앞서 저장한 스태시를 가져왔을 때 intellij IDE에서 본 상황. 주황색 글씨로 써진 파일들이 현재 변경사항이 발생한 파일들을 의미하는데, 이는 앞서 가져온 스태시가 잘 적용되었다는 뜻이다.

사진 1-5. 새 브랜치에서 앞서 저장한 스태시를 가져왔을 때 intellij IDE에서 본 상황. 주황색 글씨로 써진 파일들이 현재 변경사항이 발생한 파일들을 의미하는데, 이는 앞서 가져온 스태시가 잘 적용되었다는 뜻이다.

이제 임시 저장한 스태시가 쓸모가 없을 것이다. 그럴 때는 앞선 사진 1-3에서 보았던 것처럼 “스태시” 목록에서 삭제하고자 하는 목록을 우클릭한 후 “~ 스태시 삭제”를 누르면 삭제되는 것이다.

여기까지의 상황을 터미널에서 사용하고자 할 때 다음의 명령어들을 사용하면 된다.

# 현재 스태시 목록을 모두 조회하고자 할 경우
$ git stash list

# 위 명령어 입력 시 아래와 같이 현재까지 저장된 모든 스태시 목록들이 보인다. 
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

# 가장 최근의 스태시를 현재 브랜치에 적용하고자 할 경우. 이 명령어를 사용하면 현재 작업 디렉토리에 스태시에 저장된 변경사항들이 뜰 것이다. 
git stash apply

# 특정 스태시를 적용하고자 할 경우, 앞서 `git stash list`를 통해 나온 목록 중에서 원하는 스태시 id를 입력하면 된다.
git stash apply stash@{1}

# 특정 스태시를 삭제하고자 할 경우
git stash drop stash@{0}

# 사실 스태시 적용과 삭제를 다음과 같이 편리하게 한꺼번에 수행할 수도 있다.
git stash pop stash@{0} 

# 모든 스태시들을 한꺼번에 삭제하고자 할 경우
git stash clear

코드 1-2.

여기까지 git stash 사용법에 대한 소개였다. 이 기능을 활용하면 현재 작업을 하다가 갑자기 다른 작업을 긴급히 수행해야할 경우에 현재 작업물들을 임시 저장하여 유용하게 사용할 수 있을 것이다.


References

[1] [GIT] Git Stash 를 사용하는 이유 ( Sourcetree 및 터미널 사용 )

[2] https://git-scm.com/book/ko/v2/Git-도구-Stashing과-Cleaning#:~:text=2017년 10월 말 Git 메일링 리스트에는 엄청난,stash push 로 대체하는 내용에 대한 것이었습니다.

[3] [Git] git stash 명령어 사용하기 - Heee’s Development Blog

[4] [Git] git stash clear 복구하기

This content is licensed under CC BY-NC 4.0

댓글남기기