Git에서 브랜치를 병합(merge)하는 방법은 여러 가지가 있으며, 프로젝트의 상황과 요구 사항에 맞게 적절한 방식을 선택하는 것이 중요합니다. 이번 포스팅에서는 Git에서 자주 사용되는 병합 방법들과 그 특징을 정리해보겠습니다.
Git Branch Merge 방법과 특징
목차
Fast-Forward Merge
Fast-forward Merge는 현재 브랜치의 HEAD가 대상 브랜치의 HEAD로 옮겨가는 방식입니다. 즉, 새로운 병합 커밋을 생성하지 않고, 병합할 브랜치의 커밋을 이어 붙이는 방식입니다.
master와 dev1이 각각 참조하는 commit은 Base로 동일 선상에 위치하고 있다. 이 때 두 브랜치는 Fast-foward 상태에 있다고 한다.
Fast-Forward 관계에 있는 브랜치를 관계에서 git merge 명령을 입력하면 새로운 commit이 생기지 않는다. 뒤쳐진 브랜치(여기서는 master)의 참조 개체가 앞서있는 브랜치가 가리키는 HEAD를 참조하도록 이동할 뿐이다. 마치 브랜치가 점프 하듯 상대 브랜치 참조 값으로 이동하는 모습을 본따서 Fast-Forward(빨리감기)라고 불린다.
Fast-forward Merge 특징
- 추가 커밋 없음 : 병합을 위한 커밋이 따로 생성되지 않아 간결한 이력을 유지 할 수 있습니다.
- 간단한 이력 : 불필요한 커밋 없이 깔끔한 이력이 유지됩니다.
- 조건 : 병합하려는 브랜치가 중간에 변경이 없을 때만 동작합니다.(참조하려는 브랜치와 병합 브랜치 사이에 다른 커밋이 있고, 해당 커밋이 같은 부분을 수정했다면 충돌이 발생합니다.)
- 변경 추적 어려움 : 병합 커밋이 생성되지 않으므로, 나중에 어느 브랜치에서 병합되었는지 추적하기 어려울 수 있습니다.
사용 방법
git checkout main
git merge <branch-name> --ff-only
3-Way Merge
3-way Merge는 베이스 브랜치가 같은 서로 다른 두 브랜치에 모두 변경 사항이 있을 때, 공통 커밋을 참조해 병합 커밋을 생성하는 방식입니다. 두 브랜치의 이력을 모두 보존하며, 새로 생성된 병합 커밋을 통해 병합이 이루어집니다.
mater와 dev1 모두 Base에서 분기한 브랜치로 공통 커밋을 갖습니다. 두 브랜치 모두 분기 후 커밋 이력이 있는 상태입니다.
git merge 명령을 실행하면 새로운 commit이 생성됩니다. 3-way로 불리는 이유는 내용을 병합할 때, base와 각 브랜치 2개가 참조하는 commit을 기준으로 병합을 진행하기 때문이다.
3-way Merge 특징
- 병합 커밋 생성 : 두 브랜치를 병합하는 커밋이 추가로 생성됩니다.
- 모든 이력 보존 : 두 브랜치의 변경 이력을 모두 유지하면서 병합하기 때문에 병합 시점을 명확하게 알 수 있습니다.
- 복잡성 : 병합 커밋을 추가하기 때문에 이력이 다소 복잡해질 수 있습니다
사용 방법
git checkout main
git merge <branch-name>
Squash & Merge
Squash and Merge는 병합하려는 브랜치의 여러 커밋을 하나로 압축(squash)하여 병합하는 방식입니다. 기능 브랜치에서의 작업이 여러 커밋으로 나눠져 있을 때, 이를 하나의 커밋으로 병합해 이력을 간소화할 수 있습니다.
Squash and Merge 특징
- 하나의 커밋: 여러 커밋을 하나로 합쳐 병합해 이력을 간결하게 유지할 수 있습니다.
- 세부 이력 손실: 브랜치 내 세부 이력은 사라지고, 병합 시점에 하나의 커밋만 생성됩니다. 브랜치의 개별 커밋 기록이 없어져 세부 변경 사항을 추적하기 어렵습니다.
사용 방법
git checkout main
git merge --squash <branch-name>
git commit -m "병합 커밋 메시지"
Rebase & Merge
Rebase and Merge는 한 브랜치의 커밋을 분기된 브랜치의 최신 커밋으로 재배치하여 병합하는 방식입니다. 병합 커밋을 만들지 않고도 이력을 깔끔하게 유지할 수 있어, 연속적인 이력처럼 보이게 만듭니다.
Rebase and Merge 특징
- 이력 재배열: 병합 대상 브랜치의 커밋을 병합될 브랜치의 최신 커밋으로 옮깁니다.
- 병합 커밋 없음: 병합 커밋을 생성하지 않고, 마치 하나의 브랜치에서 작업한 것처럼 보입니다.
- 복잡한 충돌 해결 : 여러 커밋에서 충돌이 발생할 경우, 각각의 충돌을 해결해야 할 수 있습니다.
- 협업 시 위험: 이미 공유된 브랜치를 리베이스하면 이력이 변경되어 협업 과정에서 혼란을 초래할 수 있습니다.
사용 방법
git checkout <branch-name>
git rebase main
git checkout main
git merge <branch-name>
Git에서 브랜치를 병합하는 방법은 여러 가지가 있고 상황에 따라 적절한 방법을 선택하는 것이 중요합니다. 병합 방법별 특징을 다시 요약하면 다음과 같습니다:
- Fast-forward: 이력이 단순하고, 추가 커밋 없이 병합할 때 적합.
- 3-way Merge: 이력을 모두 보존하면서 병합 커밋을 추가해 명확한 병합 기록을 남기고 싶을 때.
- Squash and Merge: 자잘한 커밋을 하나로 압축해 깔끔한 이력을 유지하고 싶을 때.
- Rebase and Merge: 병합 커밋 없이 연속적인 이력을 만들고 싶을 때, 특히 충돌이 적고 협업 상황이 아닐 때.
프로젝트와 팀의 상황에 맞는 병합 전략을 선택해 효율적으로 Git 브랜치를 관리해보세요!
추천글
2024.09.14 - [개발 공부 일지/Git] - [Git] Git Branch 전략 - Git Flow vs GitHub Flow
2024.09.07 - [개발 공부 일지/Git] - Git
'개발 공부 일지 > Git' 카테고리의 다른 글
[Git] Git Branch 전략 - Git Flow vs GitHub Flow (3) | 2024.09.14 |
---|---|
Git (3) | 2024.09.07 |