01-03 브랜치와 병합
브랜치를 만들고 전환하고 합치는 법, 그리고 merge와 rebase의 차이와 충돌 해결.
브랜치를 만들고 전환하고 합치는 법, 그리고 merge와 rebase의 차이와 충돌 해결.
목표: 기능 브랜치에서 작업하고 안전하게 main에 통합
🌿 브랜치란
특정 커밋을 가리키는 움직이는 포인터. 만들고 지우는 비용이 거의 없어 자유롭게 쓴다.
graph RL
C3["C3"] --> C2["C2"] --> C1["C1"]
F2["F2"] --> C2
MAIN["main"] -.-> C3
FEAT["feature"] -.-> F2
HEAD["HEAD"] -.-> FEAT
🔧 브랜치 명령어
조회
git branch # 로컬 목록 (현재 *)
git branch -a # 원격 포함
git branch -vv # upstream + 마지막 커밋
git branch --merged # 현재에 병합된 브랜치 (삭제 후보)
git branch --no-merged # 아직 병합 안 됨
생성·전환
git switch -c feature/login # 생성 + 전환 (권장) ⭐
git switch main # 전환
git switch - # 직전 브랜치로 토글
git switch -c hotfix abc123 # 특정 커밋에서 분기
git checkout -b feature/login은 구식 동일 명령. 최신은switch(브랜치)/restore(파일)로 역할 분리.
삭제·이름변경
git branch -d feature/login # 병합된 브랜치 삭제(안전)
git branch -D feature/login # 강제 삭제
git branch -m old new # 이름 변경
🔀 Merge — 병합
git switch main
git merge feature/login
Fast-forward vs 병합 커밋
graph TB
subgraph "Fast-forward (분기 없음)"
A1["main"] --> B1["C1"] --> C1["C2(feature)"]
end
subgraph "3-way merge (분기 있음)"
A2["C1"] --> B2["C2(main)"]
A2 --> C2["C3(feature)"]
B2 --> M["Merge commit"]
C2 --> M
end
- Fast-forward: main이 분기 후 변경이 없으면 포인터만 앞으로 이동(병합 커밋 없음)
- 3-way merge: 양쪽 다 변경됐으면 공통 조상 기준으로 합쳐 병합 커밋 생성
git merge --no-ff feature/login # 항상 병합 커밋 생성(분기 흔적 보존)
git merge --squash feature/x # 변경을 한 커밋으로 압축해 가져오기
📐 Rebase — 재배치
내 커밋들을 다른 브랜치의 최신 위로 옮겨 붙여 선형 히스토리를 만든다.
git switch feature/login
git rebase main # feature 커밋을 main 최신 위로
graph LR
subgraph "rebase 전"
A["C1"] --> B["C2(main)"]
A --> C["C3"] --> D["C4(feature)"]
end
subgraph "rebase 후"
A2["C1"] --> B2["C2"] --> C2["C3'"] --> D2["C4'(feature)"]
end
| 항목 | Merge | Rebase |
|---|---|---|
| 히스토리 | 분기 보존 | 선형 |
| 커밋 해시 | 유지 | 재생성 |
| 공유 브랜치 | ✅ 안전 | ❌ 금지 |
| 용도 | main 통합 | 내 로컬 정리 |
[!danger] 리베이스 황금 규칙 이미 push 해 공유한 커밋은 절대 rebase 하지 않는다. 해시가 바뀌어 동료 히스토리와 충돌한다.
⚔️ 충돌(Conflict) 해결
양쪽이 같은 부분을 다르게 바꾸면 충돌이 난다.
git merge feature # 충돌 발생!
git status # Unmerged paths 확인
충돌 마커:
<<<<<<< HEAD
현재 브랜치(main)의 내용
=======
병합하려는(feature) 내용
>>>>>>> feature
해결 절차:
# 1. 파일을 열어 마커 제거하고 원하는 코드로 정리
# 2. 해결 표시
git add 해결된파일
# 3. 계속
git merge --continue # 또는 git rebase --continue
탈출구:
git merge --abort # 병합 취소·원상복구
git rebase --abort
[!tip] 충돌이 무서울 때
--abort로 언제든 충돌 전 상태로 되돌릴 수 있으니 안심하고 시도하라.
📋 체크리스트
- 브랜치 생성·전환·삭제
-
--merged/--no-merged로 정리 점검 - Fast-forward vs 3-way merge 구분
-
--no-ff,--squash용도 - merge vs rebase 차이 + 황금 규칙
- 충돌 마커 해석 및 해결
-
--abort로 안전 탈출
🔗 관련 노트
- 01-02-기본-명령어와-워크플로우 — 이전: 기본 명령
- 01-04-원격-저장소와-협업 — 다음: 원격
- 02-06-대화형-리베이스와-히스토리-정리 — rebase 심화
- 02-01-브랜치-전략 — 팀 브랜치 운영
마지막 업데이트: 2026-06-02