한 브랜치의 변경사항을 다른 브랜치로 가져오고 싶을 때, Git은 두 가지 도구를 제공해요 : merge와 rebase. 각각 다른 히스토리를 만들고, 장단점이 달라요.
Merge : 실제 히스토리 보존
git merge는 두 브랜치를 가져와 두 역사를 하나로 합치는 merge commit을 만들어요. 그래프가 실제 상황에 충실해요 : 브랜치가 언제 분기했고 언제 통합됐는지 정확히 볼 수 있어요.
git log --graph 결과를 보면 두 평행선이 한 점에서 만나는 모습이에요. 읽기 쉽고, 추적 가능하고, 비파괴적이에요.
Rebase : 히스토리 선형화
git rebase는 commit들을 다른 브랜치의 끝에 재현해요. 결과 : 완벽하게 선형인 히스토리, 마치 항상 main의 최신 commit 이후에 작업한 것처럼 보여요.
Git이 my-feature의 각 commit을 하나씩 이동시켜 main의 마지막 commit 이후에 재현해요. 히스토리가 merge commit 없이 직선이 돼요.
빠른 비교
| Merge | Rebase | |
|---|---|---|
| 히스토리 | 보존, merge commit 포함 | 선형화, commit 재작성 |
| 공유 브랜치에 안전한가 | 예 | 아니요 |
| 그래프 가독성 | 실제 브랜치 표시 | 깔끔하고 선형 |
어느 것을 언제 사용할까
- Merge : feature를
main에 통합할 때, 어디서 왔는지 명확하게 추적하고 싶을 때. 협업 상황의 기본 선택이에요. - Rebase : pull request를 열기 전에 로컬 브랜치 히스토리를 정리할 때.
git rebase main으로 최신 코드 위에 깔끔하게 PR을 적용해요.
일반적인 워크플로우 : my-feature에서 작업하고, git rebase main으로 불필요한 merge commit 없이 최신 상태로 맞추고, PR을 열어요. GitHub이 공식 merge commit으로 병합해요.
