본 시리즈는 기본적인 Git 사용법은 알고 있으나, 추가적으로 실무에서 활용가능한 팁들을 알고 싶은 분들을 대상으로 합니다. 😸
아래와 같은 상황을 한번 가정해보겠습니다.
당신은 feature/like
브랜치에서 한참 좋아요 기능을 구현하고 있던 중입니다.
기능은 한 70% 정도 구현되었고, 컴파일 오류를 해결하고 있는 상황!
갑자기 선임님이
"길동씨 어제 푸시하신 로그인 기능 제가 조금 수정해서 push했는데 `feature/login` 브랜치 한번 확인해볼래요?"
헉.. 😨 브랜치 옮기려면 커밋부터 해야겠지? 그런데 이렇게 에러난 상태로는 커밋 못 하는데..ㅠㅠ
브랜치를 바로 이동하고 싶지만 작업내용을 아직 커밋하지 못 했기 때문에 워킹 디렉토리를 바꿀 수 없는 진퇴양난의 상황! (에러가 있는 상태로 커밋할 순 없겠죠?!)
💡 이럴 때 유용한 git 명령어가 바로 Stash입니다
: 워킹 디렉토리에서 수정한 파일들(Modified && Tracked 상태, Staged 상태의 파일들)을 커밋하지 않고도 따로 stash stack에 보관할 수 있는 기능입니다.
그런데 stash라는 영단어의 뜻을 모르니 잘 와닿지 않죠?
stash는 "(비격식)넣어 두다"라는 뜻이라고 합니다. 비슷한 어감으로는.. 꿍쳐놓다..? 😅
쉽게 말하면 변경사항들을 stash stack
에 "꿍쳐놨다가" 나중에 필요할 때 꺼내서 사용하는 거죠!
: 워킹 디렉토리(branch)를 switch 해야 하는데 작성한 내용을 commit 하고 싶지 않을 때! 사용합니다. 인트로의 예시처럼 "기능 개발이 덜 되었을 때", "에러가 있을 경우" 굉장히 유용하죠.
stash를 사용할 수 있는 실무 시나리오를 크게 세 가지로 나눠보면,
A. 개발중인 기능이 아직 완성되지 않았는데* 다른 branch로 switch해야 할 때
B. dev 브랜치인줄 알고 한참 불나게 코딩중이었는데 master 브랜치에서 개발중이었던 것을 깨달았을 때 (아찔 😇)
C. 실험정신을 발휘해서 작성한 코드.. 버리긴 아까운데 branch를 switch해야 할 때
❓ *stash 안 쓰고 그냥 임시 브랜치 하나 파서 거기다가 commit 해놓으면 되지 않나요?
: 가능은 하지만 좋은 프랙티스는 아니라고 생각합니다.
변경사항이 완전할 때 commit을 해야하는데 여기저기 헛점 투성이인 코드를 커밋할 순 없겠죠? (commit !== 작업내용 단순저장)
"commit"이 의미있고 캡슐화된 코드에 대한 스냅샷이라면, "stash"는 단순 "일시정지" 개념이라고 할 수 있죠.
변경내용을 stash
해놓은 다음 필요할 때 끌어와서(pop or apply) 쓰면 됩니다.
stash의 기본 명령어는 딱 2가지입니다.
위 명령어로 실제 stashing 하는 흐름을 설명해드리겠습니다.
변경사항들을 stash stack에 넣어두기 위해 아래 명령어를 입력합니다.
$ git stash
마지막 commit 이후 발생한 변경사항들이 stash stack
에 올라가게 됩니다. ☁️
동시에 현재 워킹 디렉토리에서 해당 변경사항들은 뿅! 하고 사라지게 되죠.
그러면 이제 클린한 디렉토리 상태에서 다른 브랜치로 자유롭게 이동할 수 있게 됩니다.
다른 브랜치에서 볼일(?)을 다 마치고 다시 작업중이던 기존 브랜치로 돌아왔습니다. 이제 Stash에 넣어뒀던 작업내용을 다시 꺼내서 마저 작업하려고 합니다.
이 때는
$ git stash pop
명령어로 stash stack
에 저장된 작업내용을 바로 불러올 수 있습니다. git stash pop을 하면 stash stack에 저장된 내용은 사라지게 됩니다.
(Javascript의 pop 메소드가 배열의 마지막 요소를 제거하듯이요!)
이 두 명령어만 알아도 웬만한 상황에서 급한 불은 끌 수 있답니다. 간단하죠?
stash, stash pop으로 대부분의 경우 해결이 가능하지만, 상황이 조금 복잡한 경우 다른 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!
다음 편을 빨리 보고싶으시다면 좋아요 꾸욱..♥️
rebase 올려줘요!!!!!!!!!!!!!!!!!!!!