포스트

[이제와서 시작하는 GitHub 마스터하기 - 기초편 #12] Merge와 Rebase: 브랜치 통합하기

[이제와서 시작하는 GitHub 마스터하기 - 기초편 #12] Merge와 Rebase: 브랜치 통합하기

학습 목표

이 장을 마치면 다음을 할 수 있습니다:

  • ✅ Merge와 Rebase의 차이를 이해할 수 있습니다
  • ✅ 브랜치를 병합(Merge)할 수 있습니다
  • ✅ Rebase로 깔끔한 히스토리를 만들 수 있습니다
  • ✅ 충돌을 해결할 수 있습니다

지난 편 복습

기초편 #11에서는 Branch 기본을 배웠습니다:

  • Branch의 개념과 필요성
  • 브랜치 생성, 전환, 삭제
  • 브랜치 확인 및 관리
  • 브랜치 작업 흐름

Merge vs Rebase

Merge (병합)

개념: 두 브랜치를 합쳐서 새로운 병합 커밋을 생성

gitGraph
    commit
    commit
    branch feature
    checkout feature
    commit
    commit
    checkout main
    commit
    merge feature
    commit

특징:

  • ✅ 안전함 (히스토리 보존)
  • ✅ 명확한 병합 시점
  • ❌ 히스토리가 복잡해질 수 있음

Rebase (재배치)

개념: 브랜치의 베이스를 변경하여 일직선 히스토리 생성

gitGraph
    commit
    commit
    commit
    commit
    commit
    commit

특징:

  • ✅ 깔끔한 히스토리
  • ✅ 일직선으로 보기 쉬움
  • ❌ 히스토리 재작성 (주의 필요)

Merge 사용법

기본 Merge

1
2
3
4
5
6
7
8
# 1. main 브랜치로 전환
git checkout main

# 2. feature 브랜치 병합
git merge feature-branch

# 3. 푸시
git push origin main

Fast-Forward Merge

main에 새 커밋이 없을 때 빠른 병합:

Fast-Forward (기본)

1
2
3
4
5
main:  A → B → C → D → E
              ↑
        feature 브랜치가 여기서 시작했고,
        main에 새 커밋이 없으면
        그냥 포인터만 E로 이동
1
2
# Fast-forward 병합 (별도 병합 커밋 없음)
git merge feature-branch

특징:

  • ✅ 빠르고 간단
  • ❌ 브랜치 존재 이력이 사라짐
  • ❌ 어떤 커밋이 기능 단위인지 불명확

No-Fast-Forward (--no-ff)

1
2
3
4
5
6
main:  A → B → C → M (병합 커밋)
              ↘   ↗
feature:      D → E

- 병합 커밋 M이 생성됨
- 브랜치 존재 이력이 명확히 남음
1
2
# Fast-forward 방지 (항상 병합 커밋 생성)
git merge --no-ff feature-branch

특징:

  • ✅ 브랜치 이력 보존
  • ✅ 기능 단위로 롤백 가능
  • ✅ 협업 시 누가 무엇을 했는지 추적 용이

언제 --no-ff를 사용하나요?

사용 권장 ✅:

  • 팀 협업: 누가 어떤 기능을 개발했는지 추적
  • 릴리스 관리: 기능 단위로 롤백 필요
  • Git Flow: develop → main 병합 시 필수

사용 불필요 ❌:

  • 개인 프로젝트에서 작은 수정
  • Typo 수정, 문서 업데이트 등 단순 작업

예시:

1
2
3
4
5
6
7
8
9
# release 브랜치 병합 (이력 보존 필요)
git checkout main
git merge --no-ff release/v1.2.0

# 히스토리에 명확히 표시됨:
# * Merge branch 'release/v1.2.0' into main
#   - feat: add user profile
#   - fix: resolve login bug
#   - docs: update API docs

Three-Way Merge

main과 feature 모두에 새 커밋이 있을 때:

1
2
3
4
5
6
# 자동으로 병합 커밋 생성
git merge feature-branch
# Merge branch 'feature-branch' into main

# 커밋 메시지 커스터마이징
git merge feature-branch -m "Merge feature: user authentication"

Rebase 사용법

기본 Rebase

1
2
3
4
5
6
7
8
9
10
11
12
# 1. feature 브랜치로 전환
git checkout feature-branch

# 2. main의 최신 커밋 위에 재배치
git rebase main

# 3. main으로 전환 후 Fast-forward merge
git checkout main
git merge feature-branch

# 4. 푸시
git push origin main

Interactive Rebase

커밋 히스토리를 정리:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 최근 3개 커밋 편집
git rebase -i HEAD~3

# 에디터가 열리면:
# pick abc123 feat: add login
# squash def456 fix: typo
# reword ghi789 docs: update README

# 명령어:
# pick - 커밋 유지
# squash - 이전 커밋과 합치기
# reword - 메시지 수정
# edit - 커밋 편집
# drop - 커밋 삭제

Merge vs Rebase 선택 가이드

Merge 사용 시점

1
2
3
4
5
6
# ✅ 공개된 브랜치 (origin/main 등)
# ✅ 병합 히스토리 보존 필요
# ✅ 팀 협업 중인 브랜치

git checkout main
git merge feature-branch

Rebase 사용 시점

1
2
3
4
5
6
# ✅ 개인 브랜치 정리
# ✅ 깔끔한 히스토리 원할 때
# ✅ PR 전 커밋 정리

git checkout feature-branch
git rebase main

비교표

항목 Merge Rebase
히스토리 보존 (병합 커밋) 재작성 (일직선)
안전성 안전 주의 필요
협업 적합 개인 브랜치만
가독성 복잡할 수 있음 깔끔함
사용 난이도 쉬움 중간

충돌 해결

Merge 충돌 해결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 병합 시도
git merge feature-branch
# CONFLICT (content): Merge conflict in file.txt

# 2. 충돌 파일 확인
git status
# both modified: file.txt

# 3. 파일 편집
# <<<<<<< HEAD
# main의 내용
# =======
# feature의 내용
# >>>>>>> feature-branch

# 4. 충돌 해결 후
git add file.txt
git commit -m "merge: resolve conflict in file.txt"

Rebase 충돌 해결

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. Rebase 시작
git rebase main
# CONFLICT (content): Merge conflict in file.txt

# 2. 충돌 해결
# (파일 편집)

# 3. 해결 후 계속
git add file.txt
git rebase --continue

# 또는 중단
git rebase --abort

자주 묻는 질문 (FAQ)

Q1. Merge와 Rebase 중 뭐가 더 좋나요?

A: 상황에 따라 다릅니다:

  • 팀 협업: Merge (안전)
  • 개인 정리: Rebase (깔끔)
  • 공개 브랜치: Merge 필수
  • 로컬 브랜치: Rebase 가능

Q2. Rebase로 이미 push한 브랜치를 수정했어요!

A: 강제 푸시 필요 (위험!):

1
git push --force-with-lease origin feature-branch

⚠️ 팀원이 사용 중이면 문제 발생 가능!

Q3. 충돌이 너무 많아요!

A: 단계별 병합:

1
2
3
4
# main을 feature로 자주 병합
git checkout feature-branch
git merge main
# 작은 충돌을 미리 해결

Q4. Merge 커밋을 취소하려면?

A:

1
2
3
4
5
# 아직 push 안 한 경우
git reset --hard HEAD~1

# 이미 push한 경우
git revert -m 1 <merge-commit-hash>

실습 과제

과제 1: Merge 연습

  1. main에서 feature 브랜치 생성
  2. 각 브랜치에서 다른 파일 수정
  3. main에 feature 병합
  4. git log --graph --oneline 확인

과제 2: Rebase 연습

  1. feature 브랜치 생성 및 커밋 3개
  2. main에도 커밋 1개 추가
  3. feature에서 git rebase main
  4. 히스토리 확인

과제 3: 충돌 해결

  1. 같은 파일을 두 브랜치에서 수정
  2. Merge 시도 및 충돌 해결
  3. 같은 시나리오를 Rebase로 시도

마무리

축하합니다! Merge와 Rebase를 마스터했습니다.

핵심 요약:

  • Merge: 안전, 히스토리 보존, 협업에 적합
  • Rebase: 깔끔, 히스토리 재작성, 개인 브랜치 정리
  • 충돌 해결: 파일 편집 → add → commit/continue
  • 원칙: 공개 브랜치는 Merge, 로컬은 Rebase

다음 편에서는 브랜치 전략을 배워보겠습니다!

📚 GitHub 마스터하기 시리즈

🌱 기초편 (입문자)

  1. GitHub 소개와 계정 만들기
  2. 프로필 꾸미기와 포트폴리오
  3. 보안 설정과 인증
  4. Repository 이해하기
  5. README 작성법
  6. .gitignore와 라이선스
  7. 첫 커밋과 관리
  8. git add와 commit
  9. git push와 pull
  10. 실전 워크플로우
  11. Branch 기본
  12. Merge와 Rebase 👉 현재 글
  13. 브랜치 전략
  14. Fork와 Clone
  15. Pull Request

💼 실전편 (중급자)

  1. Issues 활용법
  2. Projects와 칸반보드
  3. 코드 리뷰 실전
  4. Discussions 활용
  5. 팀 협업 전략
  6. GitHub Pages 블로그

🚀 고급편 (전문가)

  1. GitHub Actions 입문
  2. Actions 고급 활용
  3. Webhooks와 API
  4. GitHub Apps 개발
  5. 보안 기능 활용
  6. Packages 레지스트리
  7. Codespaces 클라우드 개발
  8. GitHub CLI 마스터
  9. Insights와 Analytics

🏆 심화편 (전문가+)

  1. Submodules와 Subtree
  2. Git Internals 이해
  3. 브랜칭과 릴리스 전략
  4. GraphQL API 활용
  5. GitHub Copilot 마스터
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.