Git

Git - merge, rebase 개념과 차이

Creative_Lee 2022. 11. 18. 18:03

여러분은 branch를 병합하는 방법을 알고 계시나요?

 

우리는 협업 환경에서 Git을 사용합니다.

각 팀원은 자신이 맡은 기능을 개발하기 위해 branch를 만들어 작업합니다.

팀원들의 개발이 끝났다면,  모두의 작업물(branch)을 한 곳에 모아 하나의 작품을 완성해야 합니다.

 

이번 포스팅에서는 branch를 병합하는 대표적인 방법인 merge와 rebase에 대해 알아보겠습니다.

 

포스팅에 쓰이는 모든 시각화 자료는 https://learngitbranching.js.org 에서 발췌하였습니다.
Git의 여러가지 기능을 배우기 정말 좋은 사이트이니 사용해보시는 걸 추천합니다.
 

Learn Git Branching

An interactive Git visualization tool to educate and challenge!

learngitbranching.js.org


1. merge란?

merge 키워드를 사용하면 두 개의 부모가 있는 새로운 커밋을 만들어 branch를 병합합니다.

두 branch의 커밋 내역은 순서대로 정리되고 merge commit이 하나 남습니다.

그림으로 이해해봅시다.


merge 전

main branch에서 C0, C1을 commit 하였습니다.

이후 bugFix 브랜치가 생성되었고 버그는 C2 commit으로 해결되었습니다. 
그동안 main branch에서는 C3 commit을 하였습니다.


merge 후

그럼 이제 merge 해봅시다! (main branch C3에서 진행합니다.)

git merge bugFix
git push

C2, C3를 부모로 하는 새로운 commit인 C4가 생성되면서 병합이 완료되었습니다.

이제 github에서 main branch의 commit log를 확인해 볼까요?

두 branch의 커밋 이력은 순서대로 정리되었고 마지막에 merge commit이 하나 남았습니다.

main branch에선 버그가 해결되었겠네요!

이후 bugFix branch를 유지하고 싶다면 git merge main하여 main branch와 동일하게 C4를 가리키게 하면 됩니다.

필요없다면 삭제하면 됩니다.


merge --squash

--squash 옵션을 추가하면 합쳐질 branch의 커밋 이력을 하나의 커밋으로 정리할 수 있습니다.

git merge bugFix --squash
git commit -m "merge with --squash"
git push

bugFix branch의 커밋 이력은 마지막에 원하는 커밋 하나를 남기는 것으로 대체되었습니다! 

똑같이 main branch에선 버그가 해결되었습니다.


2. rebase란?

rebase 키워드를 사용한 브랜치의 커밋을 다른 브랜치에 떨궈놓는 것으로 branch를 병합합니다.

해당 브랜치의 커밋은 병합 대상 브랜치의 커밋 뒤로 정리됩니다. 마치 처음부터 병합 대상 브랜치에서 개발한 것처럼 보이게 됩니다.

rebase를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다.

그림으로 이해해봅시다.


rebase 전

main branch에서 C0, C1을 commit 하였습니다.

이후 bugFix 브랜치가 생성되었고 버그는 C3 commit으로 해결되었습니다. 
그동안 main branch에서는 C2 commit을 하였습니다.


rebase 후

그럼 이제 rebase 해봅시다! (bugFix branch C3에서 진행합니다.)

git rebase main

bugFix branch의 C3 커밋이 Main branch의 C2 커밋 뒤로 떨궈졌네요! 병합이 완료되었습니다.

하지만 main branch는 아직 제자리에 있습니다.

main branch도 병합 완료된 커밋을 가리키게 해보겠습니다.

main branch로 이동하여 똑같이 rebase 해줍니다.

git switch main
git rebase bugFix

이제 정말 병합이 완료되었습니다.

이제 github에서 main branch의 commit log를 확인해 볼까요?

C3 커밋이 Main branch의 C2 커밋 뒤로 떨궈졌기 때문에 
커밋 시간과는 무관하게 bugFix commit 더 상단에 위치하네요!

병합이 끝났습니다. main branch에선 버그가 해결되었습니다.


변경된 커밋 해시

그런데 자세히 보면 C3는 C3` 으로 병합되었습니다.

rebase는 특정 브랜치를 base로 커밋 이력을 재정렬하겠다는 명령어 입니다.

bugFix 브랜치에서 main브랜치를 기준으로 rebase 시켰기 때문에, 

main 브랜치를 기준으로 커밋이 재정렬 됩니다.

이 과정에서 커밋이력에는 이전과는 다른 새로운 해시가 생성됩니다.

 

만약 main 브랜치에서 먼저 rebase를 실행하면 어떻게 될까요 ?

git rebase bugFix

main 브랜치는 모든 브랜치의 기준 브랜치 입니다.

만약 main 브랜치에서 다른 브랜치를 기준으로 rebase을 실행하면,
main 브랜치의 커밋 해시가 변하게 됩니다.

이렇게 되면 main 브랜치에서 분기된 여러 브랜치에서 작업하던 팀원들은 변경된 해시로 인해 고통을 받게 됩니다! 
때문에 main 브랜치에서 다른 브랜치를 기준으로 rebase을 하는 경우는 피하는게 좋겠습니다.


 

 

 

 

기본이 중요하다.

 

'Git' 카테고리의 다른 글

Git - Commit message convention이란 ?  (0) 2022.10.29