본문 바로가기

업무이야기

git stash 사용법 - 깃 스태시는 어떤상황에서 필요할까 ? branch, commit의 개념과 단위

git stash 사용법

git stash 명령어는 개인 프로젝트 할 때 보다 팀 프로젝트를 할 때 많이 사용하는 명령어입니다. 저는 git을 사용할 때 아래와 같은 순서로 커밋을 하고 푸시를 합니다.

  • git add . 
  • git commit -m '[feat]git stash 공부내용 추가'
  • git push

git stash 를 사용하기에 앞서 저희는 어떤 상황에 commit을 하는지 그리고 왜 branch가 여러개 생기게 되는지 알아야 git stash의 필요성에 대해서 더 설명할 수 있을것 같습니다. 여러분은 언제 branch를 새로 만들고, 어떤 상황에서 commit을 하시나요?

 

 

 

 

git branch

저는 이전 회사에서 git branch를 잘못 사용하고 있었습니다. 그저 충돌 나게 하지 않기 위해서 팀원들끼리 각자의 이름을 따서 branch를 만들고 하나씩 본인의 파일을 만들어 그 안에서만 작업을 했었으니까요. 하지만, branch는 본래 하나의 이슈당 하나의 branch가 만들고 그 이슈가 해결이 되면 main branch에 merge 되고 그 기능을 다하면 삭제하는 방식으로 관리하는 것입니다.  예를 들면, 페이지네이션이 동작하지 않는 버그를 발견했을 경우, 해당 버그를 해결하는 branch를 팀내 컨벤션 (규칙) 에 따라 만들고 (보통 이슈번호를 많이 이용합니다.) 그 branch에서 페이지네이션이 동작하지 않는 버그를 해결하는 것입니다. 

 

git commit

commit의 단위 또한 짚고 넘어가보겠습니다. 여러분은 언제 commit이란 명령어를 사용하시나요? 제가 commit에 대해 안일하게 생각했던 때는 그저 add 다음 push를 하기전 완벽한 저장 단계 정도의 개념이었습니다. 하지만, git 에서 commit의 기준에는 꽤 엄격한 잣대가 있습니다. 바로 '논리적으로 구성되며 일관성이 유지되는 최대한 작게 쪼개야한다.' 는 것인데요, 저에게는 말이 어렵게 느껴지는것 같습니다. 그러니까, 본질적으로 협업을 할 때 같이 협업하는 사람들이 보고 명료하게 이해 될 수 있도록, 또한 추적이 용이하도록 1개의 commit에는 1개의 변경 단위만 포함되어야 한다는 것입니다. 예를 들어, 페이지네이션 스타일 변경 및 버그 수정과 같은 commit은 적절하지 않다는 것이죠.

한개의 branch에서 페이지네이션에 관한 내용들을 수정, 보완 할 수는 있지만 commit의 단위는 확실히 해야합니다. 

 

git stash

그런데 어떤 상황에 문제가 되고, 'git stash'가 필요한 순간이 오게 될까요? 제가 생각하기엔 동시다발적으로 해야할 일들이 생기기 때문입니다. 그리고 일에 우선순위가 계속 바뀌게 됩니다. 예를 들어, 페이지네이션을 만들고 있는 중인데 급하게 다른 버그를 처리해야한다거나 우선순위가 먼저인 일들을 끝내야 할 때가 있죠. 그럴 때에는 다른 이슈에 관련된 branch를 만들게 되고 checkout(다른 브랜치로 변경) 해야할 때가 옵니다. 하지만 다른 branch로 checkout(브랜치 변경)을 하기 위해서는 꼭 commit을 해야하는데요, 아직 마무리되지 않은 작업을 그대로 commit, push 할 수는 없겠지요. 작업 중에 commit을 하고 다른 branch에 가서 다른 작업을 하다가 다시 돌아와 작업을 이어가게 되는 경우, commit의 단위가 추적용이해지지 않기 때문이죠. 이때 '임시저장' 용도로 stash가 필요하게 됩니다. 

 

저 또한 stash와 친숙하지 않아 협업에 들어가기 전에 몇가지 테스트를 해보고 잘사용할것 같은 명령어를 정리해두려고 합니다. 

$ git stash
// git stash 변경 내용 임시저장하기

$ git stash list
// 내가 stash 했던 내용 보기

$ git stash apply 
// 가장 최근 stash 가지고 오기

$ git stash apply stash@{1}
// 특정 stash 가지고오기 (stash명은 stash list 참고)

$ git stash drop
// 가장 최즌 stash 지우기

$ git stash drop stash@{1}
// 특정 stash 지우기 (stash명은 stash list 참고)

$ git stash clear
// 한번에 stash 모두 지우기

 

참고로 stash는 계속 진행할수록 stack의 원리로 더 아래 순번으로 가게되며 더 큰 index 숫자를 갖게 됩니다.  그리고, stash는 apply 했다고 해서 자동으로 지워지지 않습니다. 그래서 stash를 가지고 온 후에도 계속해서 stash list에 남아있는것을 확인할 수 있습니다. 때문에 stash apply 해서 가지고 온 작업들을 마무리 해서 안전하게 commit 까지 했다면, stash drop 혹은 stash clear로 지워주시는 것이 좋습니다. 아니면 계속 stash list가 쌓이기 때문이죠.

 

 

 

 

 

위 명령어들만으로도 stash를 충분히 이용할 수 있지만 보다 편하게 작업을 관리하기 위해서 알아두면 좋은 코드들을 아래 정리해보겠습니다. 

$ git stash pop
// 가장 최근 stash를 적용하고 동시에 stack에서 지워줌 (apply + drop)

$ git stash pop stash@{1}
// 특정 stash를 적용하고 동시에 stack에서 지워줌 (apply + drop _ stack명은 stack list 참고)

$ git stash save stash이름
// stash를 원하는 이름으로 정하기

stash가 많아지다 보면 뭐가 뭔지 알아볼 수 없어집니다. 작업에 여념이 없으면 stash를 지우지 않고 쌓아두는 경우도 왕왕 있을것 같습니다. 

git stash list

하지만 stash list는 위와 같이 바로 전 commit 메시지와 index만 이렇게 보일뿐인데요, 이렇게 쌓여가는 stack들중 특정 stack을 구분하기 위해서 stash이름을 따로 저장하는 것도 작업의 효율을 높힐 수 있을것 같습니다. 

반응형