아직도 Git으로 commit만 하세요? [Git활용법 - 1. Git Stash]

Ina·2021년 1월 6일
5

Git 활용법

목록 보기
1/1
post-thumbnail

본 시리즈는 기본적인 Git 사용법은 알고 있으나, 추가적으로 실무에서 활용가능한 팁들을 알고 싶은 분들을 대상으로 합니다. 😸

  • $명령어만 필요하신 분들은 맨 아래 <3.어떻게 쓰나요?>로!

✔️ 목차

    1. Git Stash의 정의 (Git Stash가 뭔가요?)
    1. Git Stash를 활용 가능한 상황 (언제 쓰나요?)
    1. 사용 방법 및 명령어 (어떻게 쓰나요? -사용법 기본 & 심화)



What if...

아래와 같은 상황을 한번 가정해보겠습니다.

당신은 feature/like 브랜치에서 한참 좋아요 기능을 구현하고 있던 중입니다.
기능은 한 70% 정도 구현되었고, 컴파일 오류를 해결하고 있는 상황!

갑자기 선임님이

"길동씨 어제 푸시하신 로그인 기능 제가 조금 수정해서 push했는데 `feature/login` 브랜치 한번 확인해볼래요?"

헉.. 😨 브랜치 옮기려면 커밋부터 해야겠지? 그런데 이렇게 에러난 상태로는 커밋 못 하는데..ㅠㅠ

브랜치를 바로 이동하고 싶지만 작업내용을 아직 커밋하지 못 했기 때문에 워킹 디렉토리를 바꿀 수 없는 진퇴양난의 상황! (에러가 있는 상태로 커밋할 순 없겠죠?!)

💡 이럴 때 유용한 git 명령어가 바로 Stash입니다




1. Git Stash가 뭐죠?

: 워킹 디렉토리에서 수정한 파일들(Modified && Tracked 상태, Staged 상태의 파일들)을 커밋하지 않고도 따로 stash stack에 보관할 수 있는 기능입니다.

그런데 stash라는 영단어의 뜻을 모르니 잘 와닿지 않죠?


stash는 "(비격식)넣어 두다"라는 뜻이라고 합니다. 비슷한 어감으로는.. 꿍쳐놓다..? 😅

쉽게 말하면 변경사항들을 stash stack에 "꿍쳐놨다가" 나중에 필요할 때 꺼내서 사용하는 거죠!


2. 언제 쓰나요?

: 워킹 디렉토리(branch)를 switch 해야 하는데 작성한 내용을 commit 하고 싶지 않을 때! 사용합니다. 인트로의 예시처럼 "기능 개발이 덜 되었을 때", "에러가 있을 경우" 굉장히 유용하죠.
stash를 사용할 수 있는 실무 시나리오를 크게 세 가지로 나눠보면,

  • A. 개발중인 기능이 아직 완성되지 않았는데* 다른 branch로 switch해야 할 때

  • B. dev 브랜치인줄 알고 한참 불나게 코딩중이었는데 master 브랜치에서 개발중이었던 것을 깨달았을 때 (아찔 😇)

  • C. 실험정신을 발휘해서 작성한 코드.. 버리긴 아까운데 branch를 switch해야 할 때

❓ *stash 안 쓰고 그냥 임시 브랜치 하나 파서 거기다가 commit 해놓으면 되지 않나요?

: 가능은 하지만 좋은 프랙티스는 아니라고 생각합니다.
변경사항이 완전할 때 commit을 해야하는데 여기저기 헛점 투성이인 코드를 커밋할 순 없겠죠? (commit !== 작업내용 단순저장)
"commit"이 의미있고 캡슐화된 코드에 대한 스냅샷이라면, "stash"는 단순 "일시정지" 개념이라고 할 수 있죠.

3. 어떻게 쓰나요?

3-1. Command - 기본

변경내용을 stash 해놓은 다음 필요할 때 끌어와서(pop or apply) 쓰면 됩니다.

stash의 기본 명령어는 딱 2가지입니다.

  • git stash
  • git stash pop

위 명령어로 실제 stashing 하는 흐름을 설명해드리겠습니다.

① 변경사항 Stash에 넣어두기

변경사항들을 stash stack에 넣어두기 위해 아래 명령어를 입력합니다.

$ git stash

마지막 commit 이후 발생한 변경사항들이 stash stack에 올라가게 됩니다. ☁️
동시에 현재 워킹 디렉토리에서 해당 변경사항들은 뿅! 하고 사라지게 되죠.
그러면 이제 클린한 디렉토리 상태에서 다른 브랜치로 자유롭게 이동할 수 있게 됩니다.

② Stash에 넣어둔 변경사항 꺼내오기

다른 브랜치에서 볼일(?)을 다 마치고 다시 작업중이던 기존 브랜치로 돌아왔습니다. 이제 Stash에 넣어뒀던 작업내용을 다시 꺼내서 마저 작업하려고 합니다.

이 때는

$ git stash pop

명령어로 stash stack에 저장된 작업내용을 바로 불러올 수 있습니다. git stash pop을 하면 stash stack에 저장된 내용은 사라지게 됩니다.
(Javascript의 pop 메소드가 배열의 마지막 요소를 제거하듯이요!)

이 두 명령어만 알아도 웬만한 상황에서 급한 불은 끌 수 있답니다. 간단하죠?


3-2. Command - 심화

stash, stash pop으로 대부분의 경우 해결이 가능하지만, 상황이 조금 복잡한 경우 다른 stash 명령어들을 사용해야 할 수도 있습니다.

  • $git stash --all :
    : untracked files, ignored files 포함해서 모조리 stashing 합니다.
  • $git stash list
    stash list 조회하기
    : stash 를 여러 번 해서 stash stack에 작업번들이 여러 개가 쌓였을 경우 list를 조회하여 확인합니다.
👉 리스트 조회 결과 예시

stash@{0}: WIP on main: 12345 some halfdone change1
stash@{1}: WIP on main: 12346 some halfdone change2
stash@{2}: WIP on main: 12347 some halfdone change3

stash@{2}의 숫자는 index입니다.
  • $git stash apply
    : stash stack에서 마지막 작업내용을 불러오되, 스택에 저장된 작업내용을 그대로 보존합니다.
    (cf. pop은 워킹디렉토리에 작업내용을 불러온 뒤 stack에서는 작업내용을 삭제합니다)

  • $git stash apply stash@{index}
    : stack에서 인덱스번호로 특정 작업내용을 불러오고 싶을 경우 사용합니다.

  • $git stash drop stash@{index}
    : stack에 남아있는 작업내용을 지울 때

❓ pop/apply를 했는데 충돌이 발생했어요! 

: merge를 할 때처럼 stash도 코드 내용을 합치는 기능이다보니 왕왕 충돌이 나는 경우가 발생합니다.
이럴 땐 당황하지 않고! merge conflict가 났을 때와 동일하게 매뉴얼하게 코드를 수정하고 저장해주면 됩니다. 

여기까지 branch를 옮겨야 하는데 commit하기 껄끄러울 때 유용한! Git Stash 기능에 대해 알아보았습니다. 🙂

다음 시리즈는

실무뿐만 아니라 기술면접 인터뷰 단골 질문이기도 한 git rebase!
다음 편을 빨리 보고싶으시다면 좋아요 꾸욱..♥️


참고자료

profile
프론트엔드 개발자. 기록하기, 요가, 등산

1개의 댓글

comment-user-thumbnail
2022년 3월 12일

rebase 올려줘요!!!!!!!!!!!!!!!!!!!!

답글 달기