[Git] Git Merge에 대해 알아보자

IBBI·2024년 6월 3일
3

Git/GitHub

목록 보기
2/2

❓ 학습 배경

현재 진행하고 있는 프로젝트의 팀원들과 브랜치 전략에 관련된 이야기를 나누던 중,
아직 Git의 여러 병합 방법에 대한 이해도가 낮다고 생각하여 정리하게 되었다.

❓ Git Merge 종류

1. Merge
2. Squash and Merge
3. Rebase and Merge

앞으로 나올 모든 예시에는 기준 브랜치를 main으로, main 브랜치를 base로 분기된 브랜치를 feature 브랜치라고 부르겠다.

가정) feature -> main으로 merge하는 과정

1. Merge

일반적으로 많이 사용되는 병합이며, 커밋 이력을 모두 남길 때 사용한다.
아래 명령어를 통해 merge를 진행한다.

$ git checkout main
$ git merge feature

이 방식은 다시 Fast-Forward 방식과 Recursive 방식으로 나뉜다.

🔍 Fast-forward Merge

새로운 브랜치 featuremain 브랜치로부터 분기된 이후 main 브랜치에 새로운 커밋이 올라오지 않았을 경우,
feature의 변경 이력을 그대로 main으로 가져올 수 있는 방식을 말한다.

  • 병합 시 추가 커밋이 발생하지 않음

🔍 Recursive Merge

featuremain 브랜치에서 분기되고, main 브랜치에 새로운 커밋이 생겼을 경우,
featuremain을 공통 부모로 한 새로운 Merge 커밋을 생성하는 방식을 말한다.

  • 각 브랜치에서 새로 생성된 커밋들은 시간 순서로 합쳐지게 됨

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


2. Squash Merge

feature 브랜치의 여러 커밋이 모두 합쳐져 하나의 새로운 커밋을 만들고 난 다음 이전 커밋 내용을 모두 지우는 병합 방식을 말한다.

$ git checkout main
$ git merge --squash feature

기존 변경사항들이 어떻게 변했는가 보다 merge가 되었다에 좀 더 집중한 전략이다.
일반적인 merge보다 남아있는 정보량이 비교적 적기 때문에 merge log를 깔끔하게 남길 수 있지만 언제 어떤 코드를 바꿨는지에 대한 정보를 잃을 수 있다는 단점이 있다.


3. Rebase Merge

feature 브랜치의 커밋 내용을 main 브랜치에 재배치하고 추가 커밋 없이 병합하는 방식을 말한다.

$ git checkout feature
$ git rebase main
$ git checkout main
$ git merge feature

먼저 base란 featuremain 브랜치의 A 커밋에서 분기되었다고 가정하면, feature의 base는 A 커밋이다.

그렇다면, rebase는?
말 그대로 base를 다시 설정한다는 의미이다. feature가 분기된 main 브랜치의 최신 커밋이다.
rebase를 하면 기존 분기점이었던 A 커밋에서 가장 최신 커밋인 C로 base가 설정된다.

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


📎 참고 사이트
[Git] Git Rebase란? (feat. git-flow 히스토리를 더 이쁘게 만들기)
Merge 종류 (Merge / Squash & Merge / Rebase & Merge)
[Git] 이게 머지? Merge를 하는 세 가지 방식!
Git의 다양한 브랜치 병합 방법 (Merge, Squash & Merge, Rebase & Merge)
[Git/GitHub] Git Merge 와 GitHub Merge
Git Merge 종류

profile
IBBI의 말하는 감자 탈출 프로젝트

0개의 댓글