[Git] Merge, Squash, Rebase 이해하기

김민규·2021년 9월 29일
6

Git

목록 보기
1/1

서론

연구실과 한이음 프로보노 공모전을 진행하면서 Git을 사용해 형상 관리를 하고 있습니다. 이전에는 개인 Repository에서 commit과 push만 사용해 프로젝트를 진행했다면, 다른 사람과 협업을 하면서 브랜치들을 생성하고 Pull-Request를 보내고 merge를 사용해 브랜치를 합치고 있습니다. 하지만 Merge만 사용하다보니 복잡한 커밋 그래프가 생성되어 확인이 어려워지는 경우가 많아 이런 경우에 사용가능한 squash와 rebase를 함께 정리해보았습니다.

진행되는 작업

여러 명이 공동으로 작업하는 Repository를 clone 받아 작업을 한다고 생각해보자. develop이라는 공동의 브랜치가 존재하고 나는 my-feature이라는 이름의 브랜치를 만들어 작업을 한다.

$ git checkout -b my-feature

위 명령어는 아래 명령어를 한 줄로 줄인 것이다.

$ git branch my-branch
$ git checkout my-branch

만약 작업을 끝내고 develop 브랜치에 merge를 하려고 했는데, 내가 merge하기 전 팀원이 develop 브랜치에 다른 작업을 끝내고 commit 하고 push했다면 아래와 같은 모양이 될 것이다.

이 경우에 my-feature 브랜치를 develop에 병합하는 방법에는 다음과 같은 것들이 있다.

Merge


하나의 브랜치와 다른 브랜치의 변경 이력 전체를 합친다.
commit a, b, c를 참조하는 d가 생성되고 d를 통해 a + b + c가 develop 브랜치에 추가된다.
d는 2개의 parent를 가진다.

$ git checkout develop
$ git merge my-feature


Merge만 사용할 경우 서로의 commit들이 얽혀서 merge가 됩니다. 만약 더 많은 commit들이 일어난다면 커밋 그래프가 더 복잡해지고 확인이 어렵게 됩니다. 그래서 squash와 rebase를 수행해 커밋 그래프를 단순화 시킬 수 있습니다.

Squash and Merge


Squash를 사용하면 commit a + b + c를 합쳐 새로운 commit, abc를 만들어내고 develop에 추가한다. 여러 개의 commit을 하나의 commit으로 묶어버리고 싶을 때 사용하면 좋습니다.
my-feature 브랜치의 commit history를 합쳐 깔끔하게 만들 수 있다.

$ git checkout develop
$ git merge --squash my-feature
$ git commit -m "your-commit-message"


my-feature 브랜치에서 했던 세번의 commit 내역이 하나로 합쳐져 깔끔해진다.

Rebase and Merge


Rebase를 하게 되면 모든 commit들이 합쳐지지 않고 각각 develop 브랜치에 추가된다.
각 commit은 모두 하나의 parent를 가진다.

$ git checkout my-feature
$ git rebase develop
$ git checkout develop
$ git merge my-feature


my feature 브랜치는 rebase를 진행해 기존의 develop 브랜치에 commit들이 이어서 추가가 되었고 your-feature 브랜치는 develop 브랜치에 merge 되는 것을 확인할 수 있다.
merge는 merge commit 기록이 추가로 남게 되지만 rebase의 경우에는 branch 병합 시 merge commit 기록이 남지 않는다. 마치 하나의 브랜치에서 작업한 것처럼 보여진다.

결론


merge만 사용했을 때는 이런 커밋 그래프가 생성되지만 squash와 rebase를 잘 활용하면 아래와 같이 커밋 그래프를 단순하게 변경할 수 있다.

Reference

https://im-developer.tistory.com/182
https://techblog.woowahan.com/2553/

3개의 댓글

comment-user-thumbnail
2021년 12월 12일

유익한 내용 감사해요!

답글 달기
comment-user-thumbnail
2022년 12월 2일

잘 읽었습니다 멋진 글이네요

답글 달기
comment-user-thumbnail
2023년 8월 31일

설명 너무 깔끔합니다!

답글 달기