코딩해보니/Git

[Git_38] 스태시(Stash) - 사용하기

위시랜 2023. 3. 2. 13:12

스태시(Stash) - 사용하기
스태시(Stash) - 사용하기

스태시(stash) 상황 만들기

이제 스태시(stash)를 사용해 보기 위해

그럴만한 상황을 먼저 만들어 보겠습니다.

 

[상황 1] 저장소를 만들고 세 번의 커밋 진행하기

일단 실습을 통해 어떻게 활용할 수 있는지 확인해 보겠습니다.

  1. 새로운 폴더 stashrepo 를 만듭니다.
  2. $ git init 를 통해 Git 초기화합니다.
  3. index.html 파일을 만듭니다.
  4. 세 번의 커밋을 진행합니다.

그 결과를 소스트리를 통해 확인한 결과는 다음과 같습니다.

소스트리(SourceTree)에서 확인하기
소스트리(SourceTree)에서 확인하기

* index.html 파일 최종 내용

master 브랜치에서 index.html 파일 내용
master 브랜치에서 index.html 파일 내용

위 master 내용이 실제 서비스 중인 안정적인 코드라고 가정해 보겠습니다.

 

[상황 2] hotfix 브랜치 만들고 두 번의 커밋 진행하기

이제 새로운 작업을 위해 hotfix 브랜치를 만들고, 수정 작업을 진행합니다.

$ git checkout -b hotfix 명령으로 브랜치 생성과 함께 해당 브랜치로 바로 이동하겠습니다.

그 실행 화면은 다음과 같습니다.

$ git checkout -b hotfix 명령 실행
$ git checkout -b hotfix 명령 실행

hotfix 브랜치가 만들어지고 해당 브랜치로 체크아웃되었습니다.

 

여기서 index.html 파일을 수정해 두 번 커밋하겠습니다.

그 결과는 다음과 같습니다.

hotfix 브랜치에서 index.html 파일 수정 후 두 번 커밋한 결과
hotfix 브랜치에서 index.html 파일 수정 후 두 번 커밋한 결과

* hotfix 브랜치에서 커밋한 index.html 파일 최종 내용

hotfix 브랜치에서 커밋한 index.html 파일 최종 내용
hotfix 브랜치에서 커밋한 index.html 파일 최종 내용

 

[상황 3] hotfix 브랜치에서 세 번째 커밋을 위한 수정하기

여기서 다시 파일을 수정하고 저장하겠습니다.

커밋하지 않고 저장까지만 하겠습니다.

hotfix 브랜치에서 세번째 커밋을 위한 수정하기
hotfix 브랜치에서 세번째 커밋을 위한 수정하기

$ git status 로 Git의 상태를 확인한 결과 다음과 같습니다.

git status로 Git 상태 확인하기
git status로 Git 상태 확인하기

 

[상황 4] 긴급 수정을 위해 master로 체크아웃하기

[상황 3]까지 상황에서 아직 커밋할 단계는 아닌 상태에서

다른 수정 요청이 긴급하게 들어왔다고 가정해 보겠습니다.

 

지금까지 커밋 2번을 하고 3번째를 위해 작업 중이고 아직 서비스에 적용할 단계는 아닙니다.

 

그래서 현재 서비스가 되고 있는 master에서 버그 픽스를 해서 빠르게 적용해야 합니다.

그러기 위해서는 master로 체크아웃 하겠습니다.

작업중인 hotfix 브랜치에서 master 브랜치로 체크아웃하기
작업중인 hotfix 브랜치에서 master 브랜치로 체크아웃하기

그런데, master로 체크아웃을 할 수가 없습니다.

error라고 오류 메시지가 나옵니다.

오류 메시지 내용을 보니,

체크아웃하면 index.html 파일에 대해 변경사항을 덮어쓰게 되니,

체크아웃하려면 변경 사항을 커밋하거나 보관(stash) 하라고 합니다.

 

이와 같이 워킹 디렉터리를 정리하지 않으면 브랜치를 변경할 수 없습니다.

일단 불완전하지만 커밋을 해도 되겠지만

불필요한 커밋을 만들지 않고 할 수 있는 방법이 스태시(stash)를 이용하는 방법입니다.


스태시(stash) 사용하기

스태시(stash)를 이용해 임시로 보관하기 위해서는

$ git stash 또는 $ git stash save 명령을 실행합니다.

# 워킹 디렉토리 내용을 임시로 보관하기
$ git stash

 

$ git stash save 명령은 스태시를 여러 개 생성할 때 유용합니다.

스태시는 스택 구조로 여러 번 실행하여 저장할 수 있는데,

스태시가 여러 개 있을 때

각각의 스태시를 구별할 수 있도록

save를 사용해 다음과 같이 메시지를 추가할 수 있습니다.

또는 -m 옵션을 사용해 메시지를 추가할 수도 있습니다.

# 워킹 디렉토리 내용을 메시지를 포함해 임시로 보관하기
$ git stash save “메시지”
# 또는
$ git stash -m “메시지”

이렇게 저장된 스태시에

어떤 것들이 저장되어 있는지

저장되어 있는 스태시 목록을 확인하기 위해서는

다음과 같이 명령을 사용합니다.

# 보관된 임시 저장 목록 확인하기
$ git stash list

 

그럼, stash 명령으로 임시로 보관해서 워킹 디렉터리를 정리하겠습니다.
stash를 실행하고, status로 상태를 확인한 결과가 다음과 같습니다.

stash 명령어 사용 후 Git 상태 확인하기
stash 명령어 사용 후 Git 상태 확인하기

$ git stash 실행 후

“WIP on hotfix: 8b9d3de hotfix commit 2”라는 메시지로

저장되었다는 메시지를 확인할 수 있습니다.

 

또한, $ git status로 확인해 보니

워킹 디렉터리가 정리(clean) 되었음을 알 수 있습니다.

 

참고로 WIP는 Work In Progress의 줄임말로, “진행 중인 작업”을 의미합니다.

 

다음과 같이 $ git stash list로 확인해 봐도 정상적으로 확인이 됩니다.

git stash list로 스태시 목록 확인하기
git stash list로 스태시 목록 확인하기

위와 같이 $ git checkout master를 실행해 보면

이제 문제없이 체크아웃됨을 알 수 있습니다.

 

여기서 한 가지 더 확인하고 넘어가고자 합니다.

스태시를 실행한 후 현재 워킹 디렉터리와 스태시 간에 차이를 확인할 수 있습니다.

방법은 show 명령어를 함께 사용하는데 다음과 같습니다.

# 현재 워킹 디렉토리와 스태시 간의 비교하기
$ git stash show

이렇게 하면 현재 워킹 디렉토리와 마지막으로 저장한 스태시와의 차이를 확인합니다.
앞서 우리는 한번 저장했기에 마지막으로 저장한 스태시가 한 개뿐이긴 합니다.

다음은 $ git stash show를 이용해 확인한 결과입니다.

git stash show 명령 실행 화면
git stash show 명령 실행 화면

index.html 파일 하나가 삽입 1개의 변경된 내용이 있다고 보여줍니다.

 

이를 좀 더 상세히 확인하기 위해서는 -p 옵션을 사용하게 되며,

다음과 같이 사용할 수 있습니다.

# 현재 워킹 디렉토리와 스태시 간의 차이를 상세히 확인하기
$ git stash show -p <스태시 번호>

스태시 번호는 앞서 $ git stash list로 확인한

다음 화면처럼 스태시 목록에서 클론(:) 앞의 값입니다.

스태시 번호 확인
스태시 번호 확인

stash@{0} 의 스태시와 현재 워킹 디렉터리 간의 차이를 상세히 확인한 화면이 다음과 같습니다.

스태시와 현재 워킹 디렉토리의 차이를 상세히 확인하기
스태시와 현재 워킹 디렉토리의 차이를 상세히 확인하기

이 스태시는 소스트리에서도 다음과 같이 확인할 수 있으며, 아래와 같습니다.

소스트리(Sourcetree)에서 스태시 확인하기
소스트리(Sourcetree)에서 스태시 확인하기

소스트리에서 왼쪽 사이드 메뉴에

스태시 메뉴
스태시 메뉴

메뉴의 화살표를 클릭해 보면 저장된 스태시 목록이 나옵니다.

스태시 목록 중 하나를 클릭하면

오른쪽 화면에 저장된 내용을 확인할 수 있습니다.

 

이제 긴급한 수정사항을 처리하기 위해 master로 체크아웃했습니다.

index.html 파일을 수정하고 커밋하겠습니다.

수정한 내용은 다음과 같습니다.

master 브랜치에서 index.html 파일 수정
master 브랜치에서 index.html 파일 수정

소스트리에서 확인한 커밋 이력은 다음과 같습니다.

소스트리(Sourcetree)에서 커밋 이력 확인하기
소스트리(Sourcetree)에서 커밋 이력 확인하기

이제 긴급 수정 요청을 완료했으니,

다시 hotfix로 돌아가 작업을 이어가겠습니다.

 

$ git checkout hotfix 해서

임시로 저장한 스태시를 불러와 작업을 이어가야 할 텐데요.

 

스태시에 저장된 것을 불러오는 명령어는 pop이고,

다음과 같이 사용합니다.

# 스태시에 저장된 내용 불러오기
$ git stash pop

스태시의 저장 공간은 스택 구조입니다.

pop을 이용해 불러오면 스택 구조는 마지막에 저장된 내용을 불러오게 됩니다.

hotfix로 체크아웃한 후 $ git stash pop을 실행한 화면이 다음과 같습니다.

hotfix 브랜치로 이동 후 stash pop 실행 화면
hotfix 브랜치로 이동 후 stash pop 실행 화면

스태시는 스택에 저장된 내용을 불러와서

현재 브랜치의 워킹 디렉터리와 자동으로 병합하게 됩니다.

 

그 과정이 모두 문제없이 완료되면,

스태시에서 불러온 내용은 스태시 스택에서 제거됩니다.

Dropped refs/sgtash@{0} ….. 메시지 내용이 제거되었다는 내용입니다.

마지막으로 스태시 목록을 확인해 보면 없음을 알 수 있습니다.

 

스태시에 저장된 내용을 불러오는 다른 방법은

pop 대신 apply 명령을 함께 사용하는 것입니다.

 

pop과 다른 점은

pop은 불러온 다음 스태시 스택에서 바로 제거하는 반면에

apply는 제거하지 않습니다.

 

또한, apply를 이용하면 스테이지 영역의 내용까지 복구할 수 있습니다.

apply를 사용할 경우 다음과 같이 2가지로 구분해 사용할 수 있습니다.

# pop과 같이 워킹 디렉토리까지만 복구하고 스태시 스택에서 제거하지 않습니다.
$ git stash apply

# 스테이지 영역까지 복구하고, 스태시 스택에서 제거하지 않습니다.
$ git stash apply --index

apply를 사용할 경우

스태시 스택에서는 제거되지 않기 때문에

별도로 스태시 스택에서 삭제할 필요가 있습니다.

 

스태시 스택에 목록을 제거하는 명령은

drop을 사용해 제거할 수 있습니다.


그 사용법은 다음과 같습니다.

# 가장 최근의 스태시를 제거합니다.
$ git stash drop

# <스태시 이름>에 해당하는 스태시를 제거합니다.
$ git stash drop <스태시 이름>

 

또한, 스태시 스택을 한 번에 모두 지울 수도 있는데, clear를 사용합니다.

# 스태시 스택에 저장된 모든 스태시를 한번에 제거합니다.
$ git stash clear

 

스태시의 내용으로 브랜치를 만들 수도 있습니다.

# <브랜치 이름>으로 새로운 브랜치를 만들고, 
# 만들어진 새로운 브랜치에 pop 으로 스태시 내용을 불러옵니다. 
# pop으로 동작하기 때문에 스태시 스택에 저장된 내용은 제거됩니다.
$ git stash branch <브랜치 이름>

스태시를 불러올 때는 워킹 디렉터리의 상태가 정리(clean)되어 있어야 합니다.

그렇지 않을 경우 스태시를 불러왔을 때 충돌이 발생할 수 있습니다.

 

스태시를 불러와 복원하는 과정에 충돌이 발생할 경우에는

스태시 스택에 저장된 내용은 제거되지 않습니다.

 

스태시를 불러올 때 충돌이 예상된다면

위 명령을 이용해 새로운 브랜치로 스태시를 적용하면 용이합니다.


소스트리(Sourcetree)에서 스태시(stash) 사용하기

소스트리에서도 스태시를 사용할 수 있습니다.

앞서 스태시 목록을 확인하는 것은 함께 확인했습니다.

 

소스트리에서 스태시를 저장하기 위해서는

파일이 수정되어 커밋하지 않은 내용이 있는 상태가 되면

다음과 같이 상단에 스태시 버튼이 활성화됩니다.

소스트리(Sourcetree)에서 스태시 사용하기
소스트리(Sourcetree)에서 스태시 사용하기

소스트리에서 왼쪽 사이드 메뉴에

현재 브랜치(hotfix)를 선택해 보면,

상단에 [스태시] 버튼이 활성화되어 있는 것을 확인할 수 있습니다.

 

[스태시] 버튼을 클릭하면

다음과 같이 스태시에 메시지를 입력할 수 있는 창이 나타나고,

메시지를 입력하고 [확인]을 클릭하면 스태시가 실행됩니다.

메시지는 입력하지 않아도 됩니다.

스태시 메시지 입력하기
스태시 메시지 입력하기

스태시가 실행되고 나면, 왼쪽 사이드 메뉴에

메뉴에서 목록을 확인할 수 있습니다.

소스트리(Sourcetree)에서 스태시 메뉴
소스트리(Sourcetree)에서 스태시 메뉴

스태시 목록에서 마우스 오른쪽 버튼을 클릭하면

다음과 같이 팝업 메뉴가 나오는데,

해당 스태시를 적용하거나 삭제할 수 있습니다.

스태시 목록에서 마우스 오른쪽 버튼 클릭
스태시 목록에서 마우스 오른쪽 버튼 클릭

스태시(stash)는

브랜치에서 작업 중인 커밋하지 않은 내용을

임시로 저장할 때 사용하는 것을 알았습니다.

 

워킹 디렉터리와 스테이지 영역의 내용을 임시로 저장할 수 있었습니다.

저장된 스태시는

스태시를 실행한 브랜치가 아니더라도

다른 브랜치에서도 불러올 수 있습니다.

 

앞서 불러오는 명령 중에

apply를 사용해서 불러오면

스태시 목록에서 제거되지 않으므로

언제든 불러올 수 있게 됩니다.

 

지금까지 스태시(stash)를 사용하는 방법을 확인해 봤습니다.

 

감사합니다.