[이제와서 시작하는 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 연습
- main에서 feature 브랜치 생성
- 각 브랜치에서 다른 파일 수정
- main에 feature 병합
git log --graph --oneline확인
과제 2: Rebase 연습
- feature 브랜치 생성 및 커밋 3개
- main에도 커밋 1개 추가
- feature에서
git rebase main - 히스토리 확인
과제 3: 충돌 해결
- 같은 파일을 두 브랜치에서 수정
- Merge 시도 및 충돌 해결
- 같은 시나리오를 Rebase로 시도
마무리
축하합니다! Merge와 Rebase를 마스터했습니다.
핵심 요약:
- ✅ Merge: 안전, 히스토리 보존, 협업에 적합
- ✅ Rebase: 깔끔, 히스토리 재작성, 개인 브랜치 정리
- ✅ 충돌 해결: 파일 편집 → add → commit/continue
- ✅ 원칙: 공개 브랜치는 Merge, 로컬은 Rebase
다음 편에서는 브랜치 전략을 배워보겠습니다!
📚 GitHub 마스터하기 시리즈
🌱 기초편 (입문자)
- GitHub 소개와 계정 만들기
- 프로필 꾸미기와 포트폴리오
- 보안 설정과 인증
- Repository 이해하기
- README 작성법
- .gitignore와 라이선스
- 첫 커밋과 관리
- git add와 commit
- git push와 pull
- 실전 워크플로우
- Branch 기본
- Merge와 Rebase 👉 현재 글
- 브랜치 전략
- Fork와 Clone
- Pull Request
💼 실전편 (중급자)
🚀 고급편 (전문가)
- GitHub Actions 입문
- Actions 고급 활용
- Webhooks와 API
- GitHub Apps 개발
- 보안 기능 활용
- Packages 레지스트리
- Codespaces 클라우드 개발
- GitHub CLI 마스터
- Insights와 Analytics
🏆 심화편 (전문가+)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
