Developer Geek

[Git] git stash란 본문

Git

[Git] git stash란

devGeek 2022. 10. 17. 22:37
반응형

Git Stash

stash 뜻은 '넣어 두다'이다.

깃 공식 문서에 따르면 Git Stash를 다음과 같이 말하고 있다.

Stash the changes in a dirty working directory awway

말 그대로 작업물의 수정 내용을 넣어둔다(커밋하지 않고)는 의미인 것 같다.

개요

깃 공식 문서에 따르면 git stash에 대해사 다음과 같이 설명하고 있다.

Use git stash when you want to record the current state of the working directory and the index,
but want to go back to a clean working directory. The command saves your local modifications away and reverts the workig directory to match the HEAD commit.

여기서는 git stash를 어떤 상황에서 왜 써야하는지를 명시하고 있다.
git statsh를 사용할 때는 현재 작업하고 있는 부분을 기록하며 수정 전의 작업물로 돌아갈 때 사용하라고 이야기하고 있다.

사용 예시

1. Pulling into a dirty tree

내가 깃을 통해 협업을 진행한다고 가정해보자.
예를들어 내가 작업하고 있는 브랜치는 feature/login이고 이 브랜치는 develop에서 나오게 되었다.
작업하던 중 다른 팀원의 작업 내용이 develop에 합쳐지게 되었고, 작업 내용이 내가 개발중인 로그인 부분에도 영향이 있는 것이다.
만약 내가 작업한 부분이 develop에서 변경된 작업과 충돌될 부분이 없다면 간단하게 git pull을 수행하면 된다.

하지만 내가 작업한 부분이 develop에서의 변경된 작업과 충돌되는 부분이 있다면 git pull을 한다고 해도 conflict가 발생하고 쉽게 병합되지 않을 것이다.
이런 경우에 stash를 이용하여 아래와 같이 수행하면 쉽게 해결할 수 있다.

$ git pull
 ...
file foobar not up to date, cannot merge.
$ git stash -m "my stash message..."
$ git pull
$ git stash pop

위의 흐름을 가볍게 살펴보자.

  • git pull하는 과정에서 병합 실패!
  • git stash를 통해서 develop과 충돌이 발생할 수 있는 부분을 임시 저장. (-m "...": 스태시 메시지는 옵션)
  • git pull를 통해 다시 최신 버전의 develop과 병합
  • 병합 성공한 후, 임시 저장되어 있는 기존 작업내용 git stash pop을 통해 가져오기.

2. Interrupted workflow

이 경우는 내가 회사에서 일하면서 가장 많이 겪은 경우이다.
만약 내가 맡은 작업을 진행하던 중, 핫 픽스 이슈가 들어오거나 QA 검수 중 이슈 또는 앱 심사와 같은 급히 처리해야할 일들이 발생한다면 작업중인 내용은 우선순위가 밀리게된다. 그냥 커밋 후, 다른 작업을 진행하면 되지만 커밋하기에는 내용이 정리되어 있지 않고 오류를 포함한 코드들이 있을 수 있기에 커밋하기가 꺼려진다.

이런 경우에도 stash를 이용하여 아래와 같이 수행하면 커밋하지 않고 처리할 수 있다.

$ git stash -m "Stash Login to resolve hotfix"
$ resolve hotfix...
$ git commit -m "Fix in a hurry"
$ git stash pop

위의 흐름을 가볍게 살펴보자

  • git stash를 통해서 기존 작업 내용을 임시저장하고 기존의 클린한 코드로 돌아가서 핫 픽스를 대응할 상태를 만든다.
  • 핫 픽스를 대응 후, git commit -m "Fix in a hurry" 작업 내용을 커밋한다.
  • 이후에 다시 임시 저장되어 있던 기존 작업내용을 git stash pop을 통해 가져온다.

 

질문과 잘못된 점에 대해 말씀해주시는 건 언제나 환영입니다.
zero5.two4@gmail.com

 

Reference

 

Git - git-stash Documentation

A stash entry is represented as a commit whose tree records the state of the working directory, and its first parent is the commit at HEAD when the entry was created. The tree of the second parent records the state of the index when the entry is made, and

git-scm.com

 

반응형
Comments