🔄 Git Pull vs Rebase vs Merge
Git 협업에서 자주 사용되는 git pull
, --rebase
, --no-rebase
, git merge
의 차이점과 장단점을 정리.
📌 기본 개념
명령어 | 동작 요약 | 히스토리 구조 | 병합 커밋 |
---|
git pull | fetch + merge | 브랜치가 합쳐짐 | ✅ 생김 |
git pull --no-rebase | fetch + merge (rebase 방지) | 브랜치 병합 | ✅ 생김 |
git pull --rebase | fetch + rebase | 커밋을 직선형으로 재배치 | ❌ 없음 |
git merge <branch> | 수동 병합 | 현재 브랜치에만 병합 | ✅ 생김 |
✅ 예시로 보는 히스토리 변화
git pull --no-rebase
or git merge
A -- B -- C
\ \
D -- E -- M (Merge Commit)
- 로컬에서 작업한 커밋 D, E가 Merge Commit M을 통해 병합됨
git pull --rebase
- 커밋 D, E가 최신 커밋 C 이후로 재배치됨 (커밋 해시도 변경됨)
✅ 장단점 비교
구분 | 병합 방식 (pull/merge) | 리베이스 방식 (pull --rebase) |
---|
히스토리 | 브랜치 흐름이 보이고 직관적 | 깔끔하고 선형 구조 |
협업 시 가시성 | 누가 병합했는지 알 수 있음 | 병합의 흔적 없음 |
병합 커밋 | ✅ 생김 | ❌ 없음 |
충돌 처리 | 자동 병합 + 수동 해결 | 커밋마다 충돌 발생 가능 |
재작성 여부 | 기존 커밋 유지 | 커밋 해시 재작성 |
간편성 | 익숙하고 명확함 | 충돌 처리 익숙해야 함 |
자동화 적합성 | 비교적 낮음 | CI/CD에 유리한 히스토리 |
✅ git merge
와의 차이점
항목 | git pull | git merge |
---|
자동 fetch 포함 | ✅ 있음 | ❌ 없음 (수동 fetch 필요) |
히스토리 병합 전략 | 옵션 다양 | 단순 병합 |
수동 제어 | ❌ | ✅ 명확한 병합 시점 통제 가능 |
🧠 실무 추천 전략
상황 | 추천 명령어 |
---|
히스토리를 깔끔하게 유지하고 싶음 | git pull --rebase |
협업 흐름을 명확히 드러내고 싶음 | git pull --no-rebase or git merge |
안전하게만 동기화하고 싶음 | git pull --ff-only |
팀 전체 커밋 히스토리를 통제하고 싶음 | .gitconfig 에서 전략 지정 |
🛠️ 설정 팁
git config --global pull.rebase true
git config --global pull.ff only
✅ 결론
--rebase
: 히스토리 깔끔, 협업 시 충돌 처리만 주의--no-rebase
or merge
: 흐름 명확, 병합 커밋 많아질 수 있음- 상황에 따라 전략을 선택하고, 팀 컨벤션을 정해두는 것이 가장 중요.