merge, rebase, squash는 모두 branch를 통합하는 방법이다.
세 가지 방법의 차이가 뭔지 궁금해 조사하게 되었다.
1. git merge
두 개의 브랜치를 하나로 합치는 방법.
기존 브랜치의 변경 내역을 유지하면서 새로운 merge commit을 만든다.
원래 커밋 히스토리를 유지할 수 있어 협업 시 브랜치 변경 이력을 보기 좋다.
병합할 목표(main)로 이동해 병합할 대상(feature-branch)를 merge하면 된다.
git checkout main
git merge feature-branch
2. git rebase
한 브랜치의 변경 내역을 다른 브랜치 위로 다시 적용하는 방법
merge commit 없이 히스토리를 깔끔하게 유지할 수 있다.
원래의 브랜치 기반을 변경하는 것이기 때문에, 협업 중 conflict 발생 시 복잡해질 수 있다.
여기서는 적용할 대상(feature-branch)으로 이동해 적용할 목표(main)을 rebase 하면 된다.
git checkout feature-branch
git rebase main
보통 로컬에서 최신 변경 사항을 반영하면서 충돌을 최소화하고 싶을 때 사용한다.
3. git squash
여러 개의 commit을 하나의 commit으로 합치는 방법
여러 개의 작은 commit을 하나로 합쳐 commit history를 단순화하고,
기존 commit을 squash(압축)해서 새로운 commit을 생성한다.
다음과 같이 보통 rebase와 함께 사용한다.
git rebase -i HEAD~3 # 최근 3개의 커밋을 합치기
PR 제출 전 깔끔한 commit history를 유지하고 싶을 때,
여러 작은 commit을 하나의 의미 있는 commit으로 정리하고 싶을 때 사용한다.
JIRA 티켓 기반 작업에서 PR 전, 일반적으로 squash를 통해 commit을 정리한다.
merge | rebase | squash | |
merge commit | 생성됨 | x | x |
history 유지 | o | 새롭게 정리 | 하나로 압축 |
협업 시 | 안전 | 충돌 발생 가능 | 로컬 정리 시 사용 |
사용 목적 | 기록을 유지하면서 합칠 때 | 히스토리를 깔끔하게 유지할 때 | 여러 개의 커밋을 하나로 합칠 때 |
'CS > 형상관리' 카테고리의 다른 글
[Git] submodule, subtree (0) | 2025.03.04 |
---|