Git

Merge 종류 알아보기

구루싸 2024. 10. 14. 22:00
반응형
SMALL

Git에서 merge(병합)는 두 개 이상의 브랜치를 결합하여 하나로 만드는 과정입니다. 주로 한 브랜치에서 작업한 내용을 다른 브랜치에 통합하는 데 사용됩니다. Git에서 제공하는 병합 방식은 크게 Fast-forward merge, 3-way merge, 그리고 Squash merge, Rebase merge 등이 있습니다. 각각의 병합 방식은 브랜치 간의 관계나 병합 후의 기록 처리 방식에 차이가 있습니다.

Fast-forward Merge

  • 설명: Fast-forward 병합은 브랜치가 직접적으로 연결된 경우에만 발생합니다. 예를 들어, main 브랜치가 feature 브랜치 이후에 새로운 커밋이 없는 상태에서 feature 브랜치를 병합하면, Git은 main을 단순히 feature 브랜치의 끝으로 이동시키기만 합니다. 새로운 커밋을 만들지 않고 브랜치를 병합합니다.
  • 특징:
    • 새로운 커밋을 만들지 않음.
    • 병합 이력이 남지 않음.
    • 두 브랜치의 관계가 직선으로 이어짐.
  • 명령어:
git merge <branch-name>
  • 예시:
main: A---B---C
         \
feature:  D---E
# 이 상태에서 feature를 main으로 병합하면 main은 feature 브랜치의 끝으로 이동:
main: A---B---C---D---E (Fast-forward)

3-way Merge

  • 설명: 브랜치가 서로 분기한 이후에 병합할 때 사용됩니다. 두 브랜치의 공통 조상(commits)으로부터 각각의 브랜치가 달라진 커밋을 비교하여 새롭게 병합 커밋을 생성합니다. Fast-forward 병합과는 달리, 새로운 병합 커밋이 만들어집니다.
  • 특징:
    • 새로운 병합 커밋이 생성됨.
    • 병합 이력이 남음.
    • 복잡한 브랜치 구조에서 주로 사용됨.
  • 명령어:
git merge <branch-name>
  • 예시:
main: A---B---C
         \     \
feature:  D---E---F
# 이 상태에서 feature를 main으로 병합하면 병합 커밋이 생성됩니다:
main: A---B---C-------G (merge commit)
         \       \   /
feature:  D---E---F

Squash Merge

  • 설명: Squash Merge는 병합할 때, 모든 커밋을 하나의 커밋으로 합치는 병합 방식입니다. 보통 긴 개발 과정에서 여러 번의 작은 커밋을 하나의 커밋으로 병합하여 커밋 로그를 깔끔하게 유지할 때 사용됩니다.
  • 특징:
    • 병합할 브랜치의 여러 커밋을 하나의 커밋으로 압축(squash).
    • 커밋 기록이 단순해짐.
    • 병합 후 커밋 이력은 하나로 남음.
  • 명령어:
git merge --squash <branch-name>
git commit -m "Squash merge commit"
  • 예시:
main: A---B---C
         \
feature:  D---E---F
# Squash merge를 하면 D, E, F가 하나의 커밋으로 병합:
main: A---B---C---G (single squash commit)

Rebase Merge

  • 설명: Rebase는 병합과는 다른 방식으로, 브랜치의 커밋들을 다른 브랜치의 끝으로 옮기는 방식입니다. 이를 통해 커밋 히스토리가 깔끔해지며, 분기점 없이 직선형 히스토리로 이어집니다. 이를 사용하면 커밋 기록이 순차적으로 이어져, 더 간결한 히스토리를 만들 수 있습니다.
  • 특징:
    • 커밋 이력을 재구성하여 히스토리를 깔끔하게 정리.
    • 병합 커밋이 남지 않음.
    • 브랜치 간의 병합 이력이 삭제됨.
  • 명령어:
git checkout <feature-branch>
git rebase <main-branch>
  • 예시:
main: A---B---C
         \
feature:  D---E
# 이 상태에서 feature 브랜치를 main으로 리베이스하면 D와 E 커밋이 C 커밋 이후로 옮겨짐:
main: A---B---C---D---E (rebased commits)

Conflict Handling

  • 병합 도중 충돌(conflict)이 발생할 수 있습니다. 두 브랜치에서 같은 파일을 수정했을 경우 Git은 자동으로 병합할 수 없으므로 사용자가 수동으로 충돌을 해결해야 합니다.
  • 충돌 해결 후 git add 명령어로 수정한 파일을 스테이징하고, git merge --continue 또는 git rebase --continue 명령어로 병합을 완료합니다.

요약

  • Fast-forward Merge: 직선형 병합, 새로운 커밋 없이 브랜치 이동.
  • 3-way Merge: 브랜치가 분기된 상태에서 병합, 새로운 병합 커밋 생성.
  • Squash Merge: 여러 커밋을 하나의 커밋으로 병합.
  • Rebase Merge: 커밋을 다른 브랜치 끝으로 재배치하여 히스토리를 깔끔하게 정리.

각 병합 방식은 브랜치 관리 방식에 따라 적절하게 선택해서 사용하면 됩니다. Rebase는 커밋 히스토리를 간결하게 만들 때 유용하고, Squash는 많은 커밋을 하나로 합쳐 히스토리를 단순화할 때 유용합니다.

반응형
LIST