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
항목MergeRebase
히스토리분기 보존선형
커밋 해시유지재생성
공유 브랜치✅ 안전❌ 금지
용도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