현재 진행하고 있는 프로젝트의 팀원들과 브랜치 전략에 관련된 이야기를 나누던 중,
아직 Git의 여러 병합 방법에 대한 이해도가 낮다고 생각하여 정리하게 되었다.
1. Merge
2. Squash and Merge
3. Rebase and Merge
앞으로 나올 모든 예시에는 기준 브랜치를 main으로, main 브랜치를 base로 분기된 브랜치를 feature 브랜치라고 부르겠다.
가정) feature -> main으로 merge하는 과정
일반적으로 많이 사용되는 병합이며, 커밋 이력을 모두 남길 때 사용한다.
아래 명령어를 통해 merge를 진행한다.
$ git checkout main
$ git merge feature
이 방식은 다시 Fast-Forward 방식과 Recursive 방식으로 나뉜다.

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

feature가 main 브랜치에서 분기되고, main 브랜치에 새로운 커밋이 생겼을 경우,
feature와 main을 공통 부모로 한 새로운 Merge 커밋을 생성하는 방식을 말한다.
Fast-Forward Merge가 가능한 상태에서 git merge 명령에 --no-ff 옵션을 주면 강제로 Merge 커밋을 생성하게 할 수 있다.

feature 브랜치의 여러 커밋이 모두 합쳐져 하나의 새로운 커밋을 만들고 난 다음 이전 커밋 내용을 모두 지우는 병합 방식을 말한다.
$ git checkout main
$ git merge --squash feature
기존 변경사항들이 어떻게 변했는가 보다 merge가 되었다에 좀 더 집중한 전략이다.
일반적인 merge보다 남아있는 정보량이 비교적 적기 때문에 merge log를 깔끔하게 남길 수 있지만 언제 어떤 코드를 바꿨는지에 대한 정보를 잃을 수 있다는 단점이 있다.

feature 브랜치의 커밋 내용을 main 브랜치에 재배치하고 추가 커밋 없이 병합하는 방식을 말한다.
$ git checkout feature
$ git rebase main
$ git checkout main
$ git merge feature
먼저 base란 feature가 main 브랜치의 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 종류