본문 바로가기
Programming/DevOps, Tools

[Git] rebase + squash로 커밋 합치기

by kghworks 2024. 1. 24.

 

PR (MR) 요청하기 전에 커밋을 깔끔하게 만드는 습관을 갖자

 

 분기한 브랜치에서 작업하다가 PR (혹은 MR)을 날리려면 지저분한 커밋이력이 문제다. 아래는 main 브랜치에서 분기해서 feat/login 브랜치에서 3개의 커밋을 만들고 merge 하기 직전의 모습이다.

 

리뷰어에게 보기도 편하고, 브랜치 이력도 깔끔히 관리하기 위해 3개의 커밋을 하나로 합쳐서 merge 요청을 보낼 수 있다.

 

1. git rebase로 HEAD부터 n개의 커밋을 합치기

$ git rebase -i HEAD~3
pick 8a338ed 레이아웃 작업 1차 완료
pick 07fef02 레이아웃 작업 완료
pick ab0dbba 테스트 작성 완료

# Rebase 7457bdf..ab0dbba onto 7457bdf (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
...

 

아래 부분을 보면 옵션 s를 통해 squash 하여 이전 commit으로 합칠 수 있다고 나온다. (meld into previous commit)

...
# s, squash <commit> = use commit, but meld into previous commit
...

 

아래처럼 내가 합칠 커밋 2개에 대해 pick을 지우고 s로 바꾼다. (squash 하겠다는 뜻)

pick 8a338ed 레이아웃 작업 1차 완료
s 07fef02 레이아웃 작업 완료    
s ab0dbba 테스트 작성 완료   

# Rebase 7457bdf..ab0dbba onto 7457bdf (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit>
...
:wq!

 

 

wq!로 저장하고 나온다.

 

2. 합친 commit 메시지 생성

저장하고 나오면 곧장 커밋 메시지를 수정할 수 있게 해 준다. 합친 커밋에 대한 새로운 커밋메시지를 작성할 수 있다.

 

# This is a combination of 3 commits.
# This is the 1st commit message:

레이아웃 작업 1차 완료

# This is the commit message #2:

레이아웃 작업 완료

# This is the commit message #3:

테스트 작성 완료

 

난 다 지우고 아래처럼 수정했다.

로그인 작업 완료
:wq!

깔끔해진 local repository log

 

 

3. remote에 push해서 반영하기

이제 local은 깔끔해졌으니 remote에 반영할 차례다. 아래처럼 강제 push 하면 된다.

 git push -f origin feat/login

 

깔끔해진 git log

 

 


참고

https://youtu.be/su-rtXzThjE

 

댓글