본문 바로가기
utils/git and github

[Git] merge mode: merge and rebase.

by ds31x 2024. 5. 26.

Git Merge Methods

Git은 branch를 기반으로 병합을 수행함.

대표적인 병합 방식으로는 Fast-Forward Merge, 3-Way Merge, Rebase가 있음.


1. Fast-Forward Merge

Fast-Forward Merge는 순차적인 commit에 맞춰 병합하는 방식임.

  • 한 사람이 개발할 때 주로 사용하는 방식임.
  • 다른 branch라도 commit 시점에 의해 branch를 일직선으로 배치할 수 있음.
  • 새로운 병합 커밋을 생성하지 않음.

사용 예시:

git switch main
git merge feature
  • 장점:
    • 히스토리의 깔끔함.
    • 새로운 병합 커밋의 미생성.
  • 단점:
    • 현재 branch (위의 예시에서 main)가 병합 대상 branch(feature)의 부모인 경우에만 사용 가능함.

main 브랜치에서 feature 브랜치를 병합하려고 할 때,
main 브랜치가 feature 브랜치의 조상(commit)인 경우
Fast-Forward Merge가 가능함.

 

이 경우 병합 대상 브랜치는 feature 브랜치가 됨.


Fast-Forward Merge 예시

1.main 브랜치와 feature 브랜치의 상황:

main: A---B
           \
feature:    C---D

 


2.main 브랜치에 feature 브랜치를 병합할 때 feature 브랜치가 병합 대상 브랜치가 됨:

git switch main
git merge --ff-only feature

 


3.병합 후의 상황 (Fast-Forward Merge):

main: A---B---C---D
feature:      C---D

 

이 경우 main 브랜치는 feature 브랜치의 커밋을 단순히 따라가게 되어, 새로운 병합 커밋이 생성되지 않음.


2. 3-Way Merge (merge의 기본모드)

3-Way Merge는
공동조상(commit)을 포함하는 branch와
이로부터 분기된 두 개 이상의 독립적으로 변경된 branch를 병합하는 방식임.

 

Git은 공동조상(commit)을 자동으로 찾아주며 이를 기준으로 3개의 branch를 병합하여 새로운 병합 커밋을 생성함.

 

사용 예시:

git switch main 
git merge --no-ff feature

 

  • 장점:
    • 히스토리에 병합 커밋의 생성.
    • 복잡한 병합 히스토리의 관리 에 적합함.
  • 단점:
    • 새로운 병합 커밋의 생성으로 히스토리가 복잡해질 수 있음.

3-Way Merge 예시

상황 설명:

1.main 브랜치와 feature 브랜치가 같은 커밋 B에서 시작하여 각각 독립적으로 변경된 경우:

main: A---B---C
           \
feature:    D---E

2.main 브랜치에 feature 브랜치를 병합할 때 feature 브랜치가 병합 대상 브랜치가 됨:

git switch main
git merge feature

3.병합 후의 상황 (3-Way Merge):

main: A---B---C-------F
           \         /
feature:    D---E---/

이 경우 main 브랜치는 새로운 병합 커밋 F를 가지게 됨.
F 커밋은 C 커밋, E 커밋, 그리고 공동 조상인 B 커밋을 기준으로 병합된 결과임.


3-Way Merge 단계:

  1. 공통 조상(commit) 찾기:
    • Git은 B 커밋을 공통 조상(commit)으로 자동으로 찾아줌.
  2. 각 브랜치의 변경 사항 병합:
    • Git은 B 커밋을 기준으로 C 커밋과 E 커밋의 변경 사항을 병합함.
  3. 병합 커밋 생성:
    • 병합 커밋 F가 생성됨. 이 커밋은 C 커밋과 E 커밋의 내용을 포함함.

명령어 사용 예시:

git switch main
git merge feature

이와 같이, 3-Way Merge는 공통 조상(commit)을 기준으로 두 브랜치의 변경 사항을 병합하여 새로운 병합 커밋을 생성하는 방식임.
이 방식은 병합의 이력을 명확히 남기고 복잡한 히스토리를 관리하는 데 유용함.


3. Rebase

주의:
remote repository를 사용하는 경우에는
rebase를 사용하지 않아야 함.

 

외부에 공개된 commit의 위치와 hash 값을 변경시키는 rebase는 문제가 될 수 있음.

이러한 경우 revert를 사용하는 것이 권장됨.

  • Rebase는 merge 명령어로 수행되지 않지만, branch들을 병합하는 데 사용됨.
  • BASE commit을 변경하여 보다 관리하기 쉬운 일직선(선형구조)의 branch를 만들 수 있음.
  • 3-Way Merge와 달리 병합 커밋이 생성되지 않음.
  • 기준 branch의 마지막 commit으로 재정렬됨.

차이점:

  • Merge의 경우, 명령을 실행하는 곳이 기준 branch 이며 병합 대상 branch의 commit들을 불러와서 병합함.
  • Rebase의 경우, 반대로 기준 branch가 merge의 대상이 되고, 불러오는 branch가 merge의 기준 branch가 됨.

사용 예시:

git switch hotfix 
git rebase main

# rebase가 성공한 이후 main에 병합
git switch main
git merge hotfix
  • 장점:
    • 히스토리의 선형적인 유지로 깔끔함.
    • 커밋 기록의 보기 좋음.
  •  단점:
    • 이미 공유된 커밋을 `rebase`하면 안 되므로 협업 시 주의가 필요함.
    • 병합 충돌의 해결 필요성.

같이 읽어보면 좋은 자료들

2024.05.26 - [utils/git and github] - [Git] merge: branch를 합침

 

[Git] merge: branch를 합침

git merge merge는 두 개 이상의 브랜치를 병합하는 데 사용되는 Git 명령어 각각의 branch에서 작업을 수행하고 각 작업이 완료가 되면 해당 작업들을 마무리하고 기존 branch와의 merge를 수행하게 됨.

ds31x.tistory.com

2024.05.20 - [utils/git and github] - [Git] Git Summary (작성중)

 

[Git] Git Summary (작성중)

git이란2024.05.20 - [utils/git and github] - Git : 소개 git 설치 후 해줘야 하는 작업들[Git] git 설치 후 우선 해줘야 하는 작업들 (tistory.com)local repository 초기화2024.05.20 - [utils/git and github] - [Git] init : local rep

ds31x.tistory.com