본문 바로가기
Computer Science/Programming

[Git] 실무에서 은근히 유용한 git stash와 git squash

by 카프리썬 2022. 7. 10.
728x90

이 글을 쓰게 된 이유

실무에서 자주 사용하는 git 명령어들에 대해서 짚고 넘어가보려고 한다!

사실 입사하기전에는 몰랐는데, 일을 하다보니까 은근히 실무에서 많이 사용하는 명령어들이다! 

 

참고로 git rebase도 일을 하다보면서 익숙해진 명령어였다! 

함께보면 좋을글 : https://pearlluck.tistory.com/754  

 

[Git] merge말고 rebase를 사용해야하는 이유, Rebase vs Merge

이 글을 쓰게 된 이유 벌써 회사에서 6개월이나 넘게 깃을 썼지만, 그럼에도 헷갈린당ㅜㅜㅜ 나 혼자 commit, push 할때는 그래도 괜찮은데 문제는 다른 팀원들이랑 브랜치를 같이 써야야할 경우....

pearlluck.tistory.com


목차

Git Stash

  • 언제 사용하는가? 
  • git stash란?
  • 어떻게 사용하는가? 
    • git status
    • git stash 
    • git statsh list 
    • git stash apply 
    • git stash pop

Git Squash

  • 언제 사용하는가? 
  • git squash란?
  • 어떻게 사용하는가?  - 명령어.ver 
    • git rebase -i HEAD~[합치고싶은커밋개수]
    • pick을 squash로 수정
    • 수정 후  :wq!로 에디터 창을 나간다.
    • 커밋메세지 수정하지 않을경우, 한번더  :wq!
    • git commit --amend
    • git push -f origin [브랜치]
  • 어떻게 사용하는가?  - SourceTree.ver 

 

git stash

언제 사용하는가? 

팀원이랑 같은 브랜치에서 작업을 하고 있었다. 그런데 다른 팀원이 먼저 작업이 끝나서 푸쉬를 해버렸다! 

그래서 내 작업 중에 다른사람이 한 작업 내용을 풀 받아야한다! 

즉, 내가 하던 작업을 멈추고 잠시 브랜치에서 변경사항을 적용해야하는 것이다!

하지만 나는 아직 작업을 끝내지 않았기 때문에 여기에서 커밋을 하기에도 애매하다!  이럴때 쓸수 있는 명령어이다! 

 

Git stash란?

아직 마무리하지 않은 작업을 스택에 잠시 저장할 수 있는 명령어

커밋하지 않은 작업들을 stash해서 임시로 보관해두고, 나중에 다시 꺼내올수도 있다. 

 

어떻게 사용하는가?

git status로 현재상태 확인

예를 들어, 아래처럼 현재 아직 커밋되지 않고, modified된 파일이 있다고 하자.

그리고 이 파일을 임시저장하고자 한다!

git stash 명령어

그럼 save working directory를 통해, 하나의 스택이 만들어진다. 

그래서 다시 git status를 해보면, 워킹 디렉토리가 깨끗해진걸 확인할 수 있다. 

git statsh list 

그리고 statsh를 여러번햇다면, 이렇게 저장한 스택목록을 확인할 수도 있다.  (:wq!로 파일 나가기)

 

git stash apply 

그리고 이제 이렇게 임시 저장을 했으면, 변경된 사항을 다시 가지고 온다. 

스택이기 때문에 가장 최신에 stash 된 내역(stash@{0}) 들을 가지고온다. 

$ git stash 
$ git stash apply stash@{1}

이렇게 특정한 stash이름으로 특정한 스택을 가지고 올 수도 있다.

 

git stash pop

그런데 apply로 적용하면,  스택에 계속 남아있는다. 

그래서 적용과 동시에 스택에서 해당 stash를 삭제하고 싶으면 아래의 명령어를 쓰면 된다! 

$ git stash pop

 


git squash 

언제 사용하는가? 

각자 브랜치에서 작업을 완료하고, dev 혹은 master 브랜치에 merge를 요청한다. 

그럴때 커밋들 스쿼시 해서 PR(pull requset) 하면 된다!  처음에 스쿼시도 몰랐던 나..

 

Git squash란?

여러번 변경한 커밋이력을 하나의 커밋이력으로 만드는 명령어

마지막 커밋으로 merge하는 느낌이다보니 일종의 rebase를 하는 개념으로 볼수도 있다. 

 

어떻게 사용하는가? - 명령어.ver

사용하는 방식은 두가지가 있다. 하나는 명령어에서, 하나는 GIT GUI 툴인 SourceTree에서,

사내 커밋 히스토리가 공개되는것 같아서, 이부분은 직접 해본  내용이 아니라 이곳에서 참고사레를 인용해보았다. 

 

예를 들어 최종 상위3개의 커밋기록을 하나의 커밋으로 합치고 싶다면..? 

 

먼저, git 명령어로 스쿼시를 사용하는 방법이다. 

git rebase -i HEAD~[합치고싶은커밋개수]

$ git rebase -i HEAD~3

HEAD~3은 상위3개의 커밋기록을 의미한다. 

그리고 rebase -i 옵션을 통해서 interactive rebase를 한다고 보면 된다.

그러면 vi 에디터가 뜨면서 아래와 같은 메세지를 확인할 수 있다.

pick 7c65355 Task 1/3
pick 2639543 Task 2/3
pick d442427 Task 3/3

# Rebase 2260a88..d442427 onto 2260a88
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

 

즉 상위3개의 커밋들 중에서 나머지 2개의 커밋을 최종 커밋으로 합치고 싶은거니까, 

하위2개의 커밋들 앞에 있는 pick을 squash로 수정한다. 

pick 7c65355 Task 1/3
squash 2639543 Task 2/3
squash d442427 Task 3/3

 

수정 후  :wq!로 에디터 창을 나간다.

그러면 다시 vi창이 뜨면서 커밋 메세지를 rewrite하는 창이 나온다.

하지만 여기에서 수정하지 않고, 그냥 다시 :wq!로 에디터창을 다시 나간다.

pick 7c65355 Task 1/3
Rebasing (3/3)
# This is a combination of 3 commits.
# The first commit's message is:
Task 1/3

# This is the 2nd commit message:

Task 2/3

# This is the 3rd commit message:

Task 3/3

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# rebase in progress; onto 2260a88
# You are currently editing a commit while rebasing branch 'master' on '2260a88'.
#
# Changes to be committed:
#       modified:   README.md
#
~

 

 

git commit --amend

최종적으로 하나로 묶인 커밋이 확인이 되면, 이제 커밋메세지를 수정한다 

$ git commit --amend

 

git push -f origin [브랜치]

이제 최종적으로 커밋들을 하나로 스쿼시하고, 커밋메세지가 수정이 되었으면 강제로 푸쉬한다.

 

 

어떻게 사용하는가? - SourceTree.ver

소스트리에서는 조금더 간편하다.

합치고 싶은 커밋에 다음 커밋에서 하위요소 대화식 재배치 를 한다. 

 

예를 들어, 상위 3개 커밋을 하나로 합치고 싶으면 4번째 커밋에서 하위재배치를 하면 된다.

하위 재배치를 시작한 위치를 기점으로, 그 밑에 스쿼시 된 하나의 커밋이 생기는거니까!

개인적으로 이 위치가 헷갈렸는데 이곳을 참고해서 조금 감을 잡았다. (오히려 명령어가 더 편할지도?)

영어로 Rebase childer of [커밋] interactively..

 

실제 사례를 못 보여주는 상황이라 아쉬운데, 이 위치에서 대화식재배치를 하면 이렇게 3개의 커밋들이 뜬다.

그리고 계속 sqush with previous를 눌러주면 최종적으로 3개의 커밋이 하나로 합쳐지는걸 볼 수 있다.

출처 https://cuitandokter.com/


무튼 이렇게 stash와 squash에 대해서 정리해보았다.

실제 업무에서도 자주 사용하지만, 항상 헷갈려서 매번 검색했는데

이번 기회에 이렇게 정리하니까 다음번에는 이제 익숙해져서 검색안하고도 할수 있을것 같다! 🧐

반응형

$(document).ready(function() { var $toc = $("#toc"); $toc.toc({content: ".tt_article_useless_p_margin", headings: "h2,h3,h4"}); });