Git Merge Trio

봄이아빠·2024년 11월 19일
3

Git

목록 보기
1/1

Merge in Git

깃에서 브랜치를 병합할 때 사용되는 머지 삼총사입니다.

Merge Commit

merge commit은 가장 기본적인 방식입니다.
두 브랜치를 병합 시 merge commit을 생성합니다.

위에 선택 된 점이 브랜치를 병합하면서 생긴 merge commit입니다.
merge commit이 생성되는 방식은 Three-Way Merge를 따릅니다.
이는 병합하려는 두 브랜치가 서로 다른 커밋으로 나뉘었을 때, 공통 조상을 기준으로 병합 커밋을 생성하는 방식입니다.
공통 조상이란 병합하려는 두 브랜치가 공통으로 가진 마지막 커밋입니다. 즉 히스토리를 비교해서 병합합니다.
현재 브랜치(HEAD)와 병합 대상 브랜치를 병합할 때 충돌이 없는 경우 자동으로 병합합니다. 충돌이 발생한다면 사용자가 직접 수정합니다.

이러한 방식은 병합 시점의 두 브랜치 기록을 유지하고 히스토리에도 병합 흔적을 남깁니다.
따라서 브랜치의 독립적인 작업 흐름을 파악할 수 있습니다.
충돌 발생 시 병합 커밋에서 해결사항을 기록하고 다른 팀원도 히스토리를 쉽게 이해할 수 있습니다.
다만 많은 브랜치를 병합할 경우 히스토리가 복잡해집니다.
또 브랜치에서 생성된 커밋이 남아 보기 어렵기도 합니다.

Rebase

rebase는 브랜치를 병합할 때 커밋 히스토리를 선형으로 정리하는 방식입니다.
merge commit을 생성하지 않고, 병합하려는 브랜치의 커밋을 현재 브랜치의 최신 커밋 뒤로 재배치합니다.

rebase는 충돌이 발생할 경우 사용자가 직접 충돌을 해결한 뒤 다시 rebase를 이어서 실행해야 합니다.
이 방식은 히스토리를 선형으로 정리하므로 보기 쉬운 기록을 제공합니다.
다만 기존의 커밋 기록이 변경되므로 협업 중에는 사용에 주의가 필요합니다.
브랜치의 작업 흐름을 간결하게 만들어주지만 히스토리의 정확한 흐름을 알기 어려울 수 있습니다.
특히, 이미 원격 저장소에 push된 커밋을 rebase할 경우 충돌이나 데이터 손실이 발생할 가능성이 있으니 주의해야 합니다.

Squash and Merge

squash and merge는 브랜치를 병합할 때 여러 커밋을 하나로 압축(squash)하여 병합하는 방식입니다.
이 방식은 merge commit을 생성하지 않고 브랜치에 남아있는 모든 커밋을 단일 커밋으로 합칩니다.
squash and merge는 주로 작은 변경 사항을 하나의 작업 단위로 병합할 때 유용합니다.
이 방식은 히스토리를 간결하게 만들어주는 장점이 있지만 브랜치의 세부적인 작업 기록이 사라지기 때문에 작업 내용을 상세히 추적하기 어렵습니다.

Comparison of Merge Methods

병합 방식 비교 (Comparison Table)

Merge Method히스토리 유지커밋 단순화협업 충돌 위험사용 난이도
Merge CommitOX낮음쉬움
RebaseXO높음중간
Squash and MergeXO낮음쉬움

Choosing the Right Merge Method

Merge Commit 사용 시기

  • 브랜치의 작업 흐름을 명확하게 유지하고 싶은 경우
  • 병합 작업이 빈번하고 협업이 많은 프로젝트에서 충돌 기록을 남기고 싶은 경우
  • 충돌 해결 과정과 병합 히스토리를 보존해야 할 때

Rebase 사용 시기

  • 히스토리를 선형으로 정리해 간결한 기록을 유지하고 싶은 경우
  • 브랜치에서 독립적인 작업을 수행한 후, 최종 병합 시 병합 기록을 제거하고 싶을 때
  • 팀 협업보다는 개인 프로젝트에서 유용

Squash and Merge 사용 시기

  • 브랜치에서 여러 커밋을 단일 작업 단위로 병합하고 싶을 때
  • 커밋 히스토리를 간결하게 유지하고 싶은 경우
  • 브랜치에서 수행된 작업이 하나의 기능 또는 단일 변경 사항으로 요약될 때

0개의 댓글