merge와 rebase 짚고 넘어가기

sham·2025년 2월 19일
post-thumbnail

개요

여태까지 항상 pull, push, merge만 사용했었는데, 여러 명이서 협업하게 되면 깔끔한 git history를 위해 rebase도 고려를 해봐야 한다고 한다. rebase는 뭐고, merge와 뭐가 다른지 이번 기회에 알아보자.

본문

Merge에는 두 종류가 있다

Fast-Forward

분기한 브랜치의 모든 커밋 로그를 그대로 가져오는 방식으로, 가장 익숙한 방식의 Merge 방식이다.

병합 대상 브랜치(예: my-branch)가 현재 브랜치(예: main)의 최상위 커밋에서 분기된 경우, 터미널 상에서 merge 시 자동으로 Fast-Forward Merge가 된다.

merge 커밋이 생성되지 않고, main 브랜치가 my-branch브랜치의 최신으로, Fast-Forward로 이동하게 되는 것이다.

git checkout main
git merge my-branch

Recursive

my-branch 가 main 브랜치에서 분기된 이후 main 브랜치에 새로운 커밋이 생겼다면, my-branch 를 최신이라고 간주할 수 없으며, Fast-Forward merge 역시 불가능하다.

이러한 경우 merge 시 my-branch 와 main를 공통 부모로 하는 새로운 커밋을 생성하게 되는데, 이러한 방법을 Recursive Merge라고 한다.

Fast-Forward Merge가 가능한 상태에서 git merge 명령에 --no-ff 옵션을 주면 강제로 Merge Commit을 생성하게 할 수 있다.

git checkout main
git merge --no-ff my-branch

Squash & Merge

Squash는 여러개의 커밋을 하나의 커밋으로 합치는 것을 의미한다.

Squash Merge는 병합할 브랜치의 모든 커밋을 하나의 커밋으로 Squash한 새로운 커밋을 Base 브랜치에 추가하는 방식으로 병합하게 된다.

이 때, 해당 브랜치의 모든 커밋이 하나의 커밋으로 합쳐지며 사라지는 점을 유의할 것.

git checkout main
git merge --squash my-branch // main에 my-branch의 모든 변경 사항들이 스테이징된다.
git commit -m "squash & merge"

Rebase & Merge

my-branch 가 main 브랜치의 A 커밋에서 분기되었다면, my-branch 의 Base는 A 커밋을 의미한다.

Rebase는 해당 브랜치의 Base를 다시 설정한다는 의미로, my-branch의 경우 main에 rebase를 적용하면 main 브랜치의 최신 커밋을 자신의 base로 설정할 수 있다.

여러 명이서 협업 할 때 사용하게 된다면 git history의 커밋들이 작업자 별로 정렬되기에 변경 이력을 확인하기에 편리하다는 장점이 있다.

Rebase를 하면 커밋들의 Base가 변경되므로 Commit Hash 또한 변경 될 수 있다. 이로 인해 Force Push를 해야할 경우도 있으니 주의하자.

git checkout my-branch
git rebase main
git checkout main
git merge my-branch

그래서 뭘 쓰면 되는데?

최 merge 방법은 상황에 따라 다를 것이며, 각자의 상황에 따라 일장일단이 있다.

각각의 방법의 특징을 이해하고 상황에 맞는 merge를 하도록 하자.

레퍼런스

Git Merge와 Rebase의 차이, 아름다운고 깔끔한 Git History 만들기.

[GIT 좀 더 이해하기] 3. merge 와 rebase 차이

Git의 다양한 브랜치 병합 방법 (Merge, Squash & Merge, Rebase & Merge)![]

profile
씨앗 개발자

0개의 댓글