git merge

한 줄 요약

두 브랜치를 하나로 합치기

선행 지식

기본 사용법

# 현재 브랜치에 다른 브랜치를 병합
git merge <병합할-브랜>

주요 옵션

옵션설명예시
(없음)기본 병합git merge feature
--no-ffFast-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/login

Fast-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

MergeRebase
히스토리 보존히스토리 정리
Merge commit 생성커밋 재배치
안전함주의 필요
협업에 적합개인 브랜치에 적합

초심자 권장

처음에는 merge만 사용하세요. Rebase는 히스토리를 변경하므로 주의가 필요합니다.

관련 명령어

더 알아보기