(CS/컴퓨터공학) Git rebase vs merge 비교

✨ 개요

팀 협업에서 히스토리를 깨끗하게 유지할 것인가 vs 사실을 있는 그대로 남길 것인가는 늘 고민입니다.
rebasemerge의 차이, 선택 기준, 충돌 처리, 브랜치 보호 전략을 한 번에 정리합니다


1. 한 장 요약

상황 추천 이유
기능 브랜치를 메인에 깔끔하게 합치고 싶다 Rebase + FF merge 선형(linear) 히스토리, 리뷰/탐색 용이
큰 기능(여러 커밋)을 하나로 묶고 싶다 Interactive Rebase(squash/fixup) 잡음 제거, 의미 단위 커밋 유지
다수의 기능 브랜치를 동시에 통합 Merge 브랜치 관계 보존, 충돌 지점 명확화
공개 원격 브랜치, 이미 공유된 커밋 Merge 리라이트 금지(참조자 다수)
릴리즈 브랜치에서 hotfix를 메인/릴리즈 모두 반영 Merge 또는 Cherry-pick 추적성/릴리즈 정책에 따라 선택

원칙: 로컬/개인 작업은 rebase OK, 공개/공유 히스토리는 merge가 안전.


2 개념 차이

Merge (사실 기록)

A---B---C (main)
\
D---E (feature)

M (merge commit)

Rebase (히스토리 재작성)

A---B---C (main)

D'---E' (feature rebased)

3 핵심 장단점 비교

항목 Rebase Merge
히스토리 선형(읽기 쉬움) 분기/병합 흔적 보존(사실성↑)
충돌 커밋 단위로 나눠 처리(세밀) 한 번에 처리(맥락 넓음)
커밋 해시 변경(리라이트) 변경 없음
협업 안전성 공유 브랜치에 금지 안전
Bisect/추적 커밋 정제 유리 타임라인 보존 유리
CI 캐시/빌드 변경 범위 작게 유지 가능 merge 시 대규모 변경 감지 유리

4. 기본 워크플로우

4.1 기능 브랜치 선형화 (로컬)

# 최신 main 반영
git checkout feature/login
git fetch origin
git rebase origin/main   # 로컬에서만!

# 충돌 시
# 1) 파일 수정 → git add .
# 2) git rebase --continue
# 3) 포기: git rebase --abort

# 정리 후 푸시 (주의: 강제 푸시 필요)
git push -f origin feature/login

4.2 깔끔한 병합(Fast-forward 우선)

git checkout main
git fetch origin
git merge --ff-only feature/login   # 선형 유지 실패 시 에러
# 실패하면: git merge --no-ff feature/login  # merge 커밋을 명시적으로 남김
git push origin main

4.3 인터랙티브 리베이스로 커밋 정리

git rebase -i HEAD~6
# pick/squash/fixup/reword 선택
# fixup/squash 커밋은 --autosquash로 자동 정렬 가능
git rebase -i --autosquash HEAD~6

5. 충돌 처리 전략


6. 보호 규칙(Branch Protection)과 정책


7. 실무 팁 모음


8. 안티패턴 방지


결론



Related Posts