깃에서 브랜치를 병합할 때 사용되는 머지 삼총사입니다.
merge commit은 가장 기본적인 방식입니다.
두 브랜치를 병합 시 merge commit을 생성합니다.
위에 선택 된 점이 브랜치를 병합하면서 생긴 merge commit
입니다.
merge commit이 생성되는 방식은 Three-Way Merge
를 따릅니다.
이는 병합하려는 두 브랜치가 서로 다른 커밋으로 나뉘었을 때, 공통 조상을 기준으로 병합 커밋을 생성하는 방식입니다.
공통 조상이란 병합하려는 두 브랜치가 공통으로 가진 마지막 커밋입니다. 즉 히스토리를 비교해서 병합합니다.
현재 브랜치(HEAD)와 병합 대상 브랜치를 병합할 때 충돌이 없는 경우 자동으로 병합합니다. 충돌이 발생한다면 사용자가 직접 수정합니다.
이러한 방식은 병합 시점의 두 브랜치 기록을 유지하고 히스토리에도 병합 흔적을 남깁니다.
따라서 브랜치의 독립적인 작업 흐름을 파악할 수 있습니다.
충돌 발생 시 병합 커밋에서 해결사항을 기록하고 다른 팀원도 히스토리를 쉽게 이해할 수 있습니다.
다만 많은 브랜치를 병합할 경우 히스토리가 복잡해집니다.
또 브랜치에서 생성된 커밋이 남아 보기 어렵기도 합니다.
rebase는 브랜치를 병합할 때 커밋 히스토리를 선형으로 정리하는 방식입니다.
merge commit을 생성하지 않고, 병합하려는 브랜치의 커밋을 현재 브랜치의 최신 커밋 뒤로 재배치합니다.
rebase는 충돌이 발생할 경우 사용자가 직접 충돌을 해결한 뒤 다시 rebase를 이어서 실행해야 합니다.
이 방식은 히스토리를 선형으로 정리하므로 보기 쉬운 기록을 제공합니다.
다만 기존의 커밋 기록이 변경되므로 협업 중에는 사용에 주의가 필요합니다.
브랜치의 작업 흐름을 간결하게 만들어주지만 히스토리의 정확한 흐름을 알기 어려울 수 있습니다.
특히, 이미 원격 저장소에 push된 커밋을 rebase할 경우 충돌이나 데이터 손실이 발생할 가능성이 있으니 주의해야 합니다.
squash and merge
는 브랜치를 병합할 때 여러 커밋을 하나로 압축(squash)하여 병합하는 방식입니다.
이 방식은 merge commit을 생성하지 않고 브랜치에 남아있는 모든 커밋을 단일 커밋으로 합칩니다.
squash and merge
는 주로 작은 변경 사항을 하나의 작업 단위로 병합할 때 유용합니다.
이 방식은 히스토리를 간결하게 만들어주는 장점이 있지만 브랜치의 세부적인 작업 기록이 사라지기 때문에 작업 내용을 상세히 추적하기 어렵습니다.
Merge Method | 히스토리 유지 | 커밋 단순화 | 협업 충돌 위험 | 사용 난이도 |
---|---|---|---|---|
Merge Commit | O | X | 낮음 | 쉬움 |
Rebase | X | O | 높음 | 중간 |
Squash and Merge | X | O | 낮음 | 쉬움 |