[Git] Git rebase, Git squash로 커밋 정리하기

resilient

·

2021. 11. 30. 13:31

728x90
반응형

최근에 회사에서 다른 프로젝트팀을 도와 translation작업을 한 적이 있습니다.

 

branch를 새로 만들어서 git rebase 후, 작업을 해서 pull request를 올렸습니다.

당연히 이전에 제가 하지 않은 작업의 커밋까지 모두 올라갔고, 뭔가 정리를 해서 올려야겠다 라는 생각을 한 그 순간,

다른 팀원 분이 1분도 채 지나지 않고 comment를 달아주셨습니다.

squash and merge..?

 

Squash and merge? git에 익숙하지 않은 저에게는 생소한 명령어였지만, 아 커밋을 정리해주는 명령어구나 라는 사실은 단 번에 알 수 있었습니다.

그래서 오늘은! Git Squash에 대해서 알아보려고 합니다.

 

Git Squash 를 왜 써야 할까요?                                                                              

 

협업을 진행하거나, 회사에서 소스코드를 수정할 때 보통 브랜치를 만듭니다. 작업이 완료되면, 이렇게 만든 브랜치에 수정한 내용을 커밋(Commit)합니다. 하지만 보통 커밋 한 번에 모든 것을 수정할 수 없을 때가 있습니다. 프런트 사이드 소스 코드 커밋, 서버 사이드 소스 코드 커밋, 테스트 코드 커밋, 코드 리뷰 대응 커밋 등, 한 이슈를 수정하기 위해 여러 커밋이 발생하게 됩니다.

이렇게 발생한 커밋들은 그냥 merge해도 되지만, 커밋 이력이 많아지고 복잡해지는 상황이 발생하면, 관리도 힘들고 나중에 이력을 추적하는 것도 힘들어 질 수 있겠죠?

그래서 사용하는 것이 바로 Git Squash입니다!

 

Git Squash란?                                                                                                     

 

Git Squash는 여러번 커밋한 이력을 하나의 커밋 이력으로 만드는 데 사용합니다.

 

그럼 한 번 예시를 들어서 설명해보겠습니다!

 

아래는 main 브랜치에서 squashtest 브랜치를 만들었습니다. (아래 squashtest 해본 커밋 내역이 있군요)

 

그럼 이제 약간씩 수정을 해서 first squash, second squash, third squas 커밋을 해보겠습니다.

 

그럼 이제 Squash 명령어로 위에 올린 세개의 커밋을 하나의 커밋으로 만들어보겠습니다.

squash 명령어를 사용하기 전에는 git rebase를 먼저 사용해야 합니다.

3개의 커밋을 하나의 커밋으로 만들 예정이므로 3개의 커밋을 하기 전 8 fc245 cb3cc 1844452221d9f1 ae844 cddc4 ae668으로 Rebase를 합니다.

git rebase -i 8fc245cb3cc1844452221d9f1ae844cddc4ae668

위에 처럼 -i 옵션을 적용하면 , 보통의 rebase와 다르게 아래와 같은 결과를 얻을 수 있습니다.

 

위 화면은 Rebase를 통해 커밋 이전의 상태로 되돌아가려고 하는데, 현재와 과거 사이에 남아 있는 커밋을 어떻게 처리하겠냐고, Git이 친절하게 물어봐 주는 화면입니다. 하단의 사용 가능한 Command도 나열되어 있습니다. 우리는 여기서 s, squash를 사용할 예정입니다.

이번 커밋에는 first squash을 남겨두고 second squash과 third squash을 Squash하도록 하겠습니다. 키보드의 i 버튼을 누르고 (vim편집기 명령어와 같습니다.) 수정 가능한 상태로 변경한 다음, 아래와 같이 수정합니다.

 

그리고 키보드의 ESC 버튼을 누르고 :wq를 입력한 다음 Enter 키를 눌러 변경한 내용을 저장합니다. 변경이 완료되면 아래와 같은 화면을 볼 수 있습니다

 

이 화면은 Git이 Rebase를 통해 Squash를 할 예정인데, 이전에 작성한 커밋 메시지는 어떻게 할지 물어보는 화면입니다. Git이 모든 메시지를 한 화면에 보여주고 있습니다. 역시 키보드의 i 버튼을 누른 다음, 아래와 같이 수정합니다. (메시지는 여러분의 환경에 맞게 변경하시기 바랍니다.)

 

메시지 작성이 완료되었다면, 키보드의 ESC 버튼을 누르고 :wq를 입력하여 저장해 줍니다.

다시 git log --pretty=oneline으로 커밋 이력을 확인하면, 아래와 같이 Fix Squash Test Final 커밋으로 축약이 된 걸 확인할 수 있습니다.

 

이제 Fix Squash Test Final 커밋을 push 해보겠습니다.

 

원격 저장소에 push가 완료되었습니다! 이제 main에 squashtest 브랜치를 merge 하고 git log를 확인해볼까요?

 

 

이제 확인을 해보면 main 브랜치에 Fix Squash Test Final 커밋, squash를 사용해서 정리한 커밋이 잘 merge 됐습니다.

 

 

 

Git이 정말 좋은 툴이라는 건 익히 들어 알고 있었지만, 많은 기능들을 직접 접하고 실무에서 사용하다보니 개발 협업에, 그리고 코드관리에 필수적이라는 생각이 또 한번 들었습니다.

 

그래서 저도 앞으로 많이 쓰게 되는 git 명령어들을 하나하나 정리해보려고합니다.

반응형