Git을 사용하다 보면 브랜치 병합(Merge)은 필수적인 작업이다. 병합에는 다양한 방법이 있고, 각 방식마다 적합한 상황과 특징이 있다. 이번 글에서는 3-way merge, fast-forward merge, rebase and merge, squash and merge의 네 가지 방법과 그 활용 방안을 알아본다.
1. 3-way Merge
3-way merge는 Git에서 가장 기본적인 병합 방식이다. 두 브랜치를 합칠 때 새로운 커밋을 자동으로 생성하며, 병합 과정에서 세 가지 데이터를 참고한다. 기준 브랜치의 마지막 커밋, 작업 브랜치의 마지막 커밋, 그리고 두 브랜치가 공통적으로 공유하는 기반 커밋이다.
특징:
- 새로운 병합 커밋이 생성된다.
- git log로 main 브랜치의 기록을 확인하면 3-way merge로 인해 여러 브랜치의 커밋 내역이 포함되어 복잡해진다.
- 커밋 히스토리를 간결하게 유지하려면 rebase나 squash and merge를 사용하는 것이 좋다.
사용 예시:
git switch main
git merge feature-branch
2. Fast-forward Merge
fast-forward merge는 새로운 브랜치에서만 커밋이 추가되고 기준이 되는 브랜치에는 변경 사항이 없는 경우 발생한다. 이 조건이 충족되면 Git은 병합 커밋을 생성하지 않고 브랜치를 단순히 앞으로 이동시킨다. 즉, fast-forward merge를 자동으로 실행한다.
특징:
- 병합 과정에서 새로운 커밋이 생성되지 않는다.
- 히스토리가 깔끔하게 유지된다.
- 단, base 커밋으로부터 기준 브랜치에 변경 사항이 생기면 fast-forward merge를 사용할 수 없다.
사용 예시:
git switch main
git merge feature-branch
3. Rebase and Merge
rebase and merge는 작업 브랜치의 base 커밋을 기준 브랜치의 최신 커밋으로 옮긴 뒤 fast-forward merge를 수행하는 방식이다. 이를 통해 커밋 내역을 깔끔하게 한 줄로 유지할 수 있다.
특징:
- 3-way merge 대신 강제로 fast-forward 병합을 사용할 수 있다.
- 커밋 히스토리를 단순하고 일관성 있게 유지할 수 있다.
사용 예시:
- 작업 브랜치로 이동하여 rebase를 수행한다.
- 다시 기준 브랜치로 이동해 fast-forward merge를 진행한다.
git switch feature-branch
git rebase main
git switch main
git merge feature-branch
4. Squash and Merge
squash and merge는 작업 브랜치의 여러 개의 커밋을 하나로 합쳐서 병합하는 방식이다. 작업 브랜치의 모든 커밋을 단일 커밋으로 압축한 후 기준 브랜치에 추가한다. 이를 통해 지저분한 커밋 내역을 간결하게 정리할 수 있다.
특징:
- 작업 브랜치의 모든 커밋이 하나의 커밋으로 정리된다.
- 코드 내역을 간결하고 체계적으로 유지할 수 있다.
- 개발 중에 발생한 자잘한 커밋을 묶어서 중요한 커밋만 남기기에 유용하다.
사용 예시:
git switch main
git merge --squash feature-branch
git commit -m "Squash and Merge"
언제 어떤 방식을 사용해야 할까?
feature : 기능을 개발하는 브랜치
develop : 다음 출시 버전을 개발하는 브랜치
main : main 브랜치
1) feature 브랜치에서 develop 브랜치로 Merge할 때는 Squash and Merge
- 이유: feature 브랜치에서 발생한 자잘한 커밋을 develop 브랜치에 병합할 때 기능 단위로 정리할 수 있다.
- 장점: 깔끔한 커밋 히스토리를 유지하면서, feature 브랜치를 병합 후 삭제할 수 있다.
2) develop 브랜치에서 main 브랜치로 Merge할 때는 Rebase and Merge
- 이유: main 브랜치는 배포를 위해 작업된 모든 기능을 병합하는 브랜치이다. squash and merge를 사용하면 커밋 내역이 사라져 특정 기능에서 문제가 발생했을 때 롤백이 어려워진다. 따라서 rebase and merge를 통해 모든 커밋 내역을 보존하면서 히스토리를 깔끔하게 정리한다.
끝.
'Study' 카테고리의 다른 글
지속적 통합과 배포의 핵심, CI/CD 파이프라인 (0) | 2025.03.30 |
---|---|
동기화 3가지 조건과 다양한 동기화 기법 정리 (0) | 2025.02.10 |
동기와 비동기, 블로킹과 논블로킹의 차이점 및 조합 이해하기 (0) | 2025.02.05 |
JVM의 구조와 동작 원리 (1) | 2025.01.23 |
Spring MVC 패키지 구조 (0) | 2025.01.15 |