git merge
한 줄 요약
두 브랜치를 하나로 합치기
선행 지식
- Branch란 - 브랜치의 개념
- git branch - 브랜치 관리
- git checkout과 switch - 브랜치 전환
기본 사용법
# 현재 브랜치에 다른 브랜치를 병합
git merge <병합할-브랜치>주요 옵션
| 옵션 | 설명 | 예시 |
|---|---|---|
| (없음) | 기본 병합 | git merge feature |
--no-ff | Fast-forward 금지 | git merge --no-ff feature |
--squash | 커밋 합치기 | git merge --squash feature |
--abort | 병합 취소 | git merge --abort |
-m | 메시지 지정 | git merge feature -m "Merge" |
병합 방식
1. Fast-forward Merge
분기 후 원래 브랜치에 변화가 없을 때:
Before:
main: [c1]───▶[c2]
│
feature: └───▶[c3]───▶[c4]
After (fast-forward):
main: [c1]───▶[c2]───▶[c3]───▶[c4]
▲
feature
$ git switch main
$ git merge feature
Updating a1b2c3d..9x8y7z6
Fast-forward포인터만 이동하므로 새 커밋이 생기지 않습니다.
2. 3-Way Merge
양쪽 브랜치 모두 변화가 있을 때:
Before:
main
│
▼
[c1]───▶[c2]───▶[c5]
│
└───▶[c3]───▶[c4]
▲
feature
After (3-way merge):
main
│
▼
[c1]───▶[c2]───▶[c5]──────┬───▶[c6] ← Merge commit
│ │
└───▶[c3]───▶[c4]
▲
feature
$ git switch main
$ git merge feature
Merge made by the 'ort' strategy.새로운 merge commit이 생성됩니다.
실제 예제
기능 브랜치 병합
# 1. main 브랜치로 이동
git switch main
# 2. 최신 상태로 업데이트 (원격 저장소가 있다면)
git pull origin main
# 3. feature 브랜치 병합
git merge feature/login
# 4. 병합 완료 후 기능 브랜치 삭제
git branch -d feature/loginFast-forward 방지
프로젝트 히스토리에서 기능 개발 흔적을 남기고 싶을 때:
git merge --no-ff feature/login -m "feat: 로그인 기능 병합"# --no-ff 사용 시
[c1]───▶[c2]───────────────▶[c5] ← Merge commit (기록 남음)
│ │
└───▶[c3]───▶[c4]
# Fast-forward 시
[c1]───▶[c2]───▶[c3]───▶[c4] ← 브랜치 흔적 없음
여러 커밋을 하나로 합치기
git merge --squash feature
git commit -m "feat: 기능 추가 (squashed)"feature 브랜치의 모든 커밋이 하나의 커밋으로 합쳐집니다.
충돌 발생 시
같은 파일의 같은 부분을 다르게 수정했다면 충돌이 발생합니다:
$ git merge feature
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.충돌 해결 순서
# 1. 충돌 파일 확인
git status
# 2. 파일 열어서 수정
# <<<<<<< HEAD
# 내 코드
# =======
# 병합할 코드
# >>>>>>> feature
# 3. 마커 제거하고 원하는 코드 유지
# 4. 해결 완료 표시
git add app.js
# 5. 병합 커밋
git commit→ 충돌 해결하기 참고
병합 취소
충돌이 너무 복잡하면 병합을 취소할 수 있습니다:
git merge --abort병합 시작 전 상태로 돌아갑니다.
병합 후 원격에 반영
git push origin main자주 하는 실수
잘못된 브랜치에서 병합
# 실수로 feature에서 main을 병합
git switch feature
git merge main # ← 반대로 함!해결:
# 병합 전으로 되돌리기
git reset --hard HEAD~1병합 충돌 후 커밋 잊음
$ git merge feature
CONFLICT...
# 충돌 해결 후...
$ git status
All conflicts fixed but you are still merging.해결:
git commit # 병합 커밋 완료이미 병합된 브랜치를 다시 병합
$ git merge feature
Already up to date.문제없음 - 이미 병합되어 있습니다.
병합 vs Rebase
| Merge | Rebase |
|---|---|
| 히스토리 보존 | 히스토리 정리 |
| Merge commit 생성 | 커밋 재배치 |
| 안전함 | 주의 필요 |
| 협업에 적합 | 개인 브랜치에 적합 |
초심자 권장
처음에는 merge만 사용하세요. Rebase는 히스토리를 변경하므로 주의가 필요합니다.
관련 명령어
- git branch - 브랜치 관리
- git checkout과 switch - 브랜치 전환
- git log - 병합 히스토리 확인
더 알아보기
- Branch란 - 브랜치 개념
- Conflict란 - 충돌의 원리
- 충돌 해결하기 - 충돌 해결 상세 가이드
- Pull Request란 - PR을 통한 병합