실무에서 main(master)
과 dev(develop)
브랜치를 분리해 개발하는 경우가 많습니다. 이때 두 브랜치를 병합(merge)할 때 merge 커밋 메시지가 생기기도 하고, 안 생기기도 하는 이유를 명확히 이해해야 협업과 히스토리 관리가 쉬워집니다.
브랜치 분리 상황
- main: 배포/운영용, 항상 안정적인 코드만 유지
- dev: 개발용, 여러 기능/버그 수정 커밋이 쌓임
- 개발이 끝나면 dev → main으로 병합
merge 커밋 메시지가 생기고, 안 생기는 이유
핵심은 Git의 병합 방식에 있습니다. 대표적으로 두 가지:
1. Fast-forward merge (빠른 병합) → 커밋 메시지 없음
- 조건: main 브랜치가 dev 브랜치보다 뒤처져만 있고, main에는 dev 이후 별도 커밋이 없음
- 결과: main이 dev의 커밋을 그대로 따라가며, 병합 커밋 없이 선형 히스토리 유지
- 커밋 메시지 없음
git checkout main
git merge dev # fast-forward → 병합 커밋 없음
2. Merge commit (일반 병합) → 커밋 메시지 생김
- 조건: main과 dev에 서로 다른 커밋이 존재할 때 (main에도 dev 이후 커밋이 있음)
- 결과: Git이 두 브랜치를 병합하며 새로운 병합 커밋을 생성
- 자동 커밋 메시지 생성:
Merge branch 'dev' into main
git checkout main
git merge dev # 일반 병합 → 병합 커밋 + 메시지 생성
어떻게 확인할 수 있나요?
git log --oneline --graph
- Fast-forward: 브랜치가 쭉 이어짐 (선형)
- Merge commit: 갈라졌다가 합쳐진 흔적(⎇)이 보임
정리 표
상황 | 병합 커밋 | 커밋 메시지 |
---|---|---|
main에 커밋 없음, dev만 앞섬 | ❌ 없음 (Fast-forward) | ❌ 없음 |
main과 dev 모두 커밋 있음 | ✅ 있음 (Merge commit) | ✅ 자동 생성 (Merge branch 'dev'...) |
--no-ff 옵션 사용 시 | ✅ 항상 생성 | ✅ 명시적 메시지 입력 |
팁: 항상 병합 커밋을 만들고 싶다면?
git merge dev --no-ff
- 또는 GitHub PR에서 "Create a merge commit" 옵션을 선택하면 됩니다.