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
)의 부모인 경우에만 사용 가능함.
- 현재 branch (위의 예시에서
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 단계:
- 공통 조상(commit) 찾기:
- Git은
B
커밋을 공통 조상(commit)으로 자동으로 찾아줌.
- Git은
- 각 브랜치의 변경 사항 병합:
- Git은
B
커밋을 기준으로C
커밋과E
커밋의 변경 사항을 병합함.
- Git은
- 병합 커밋 생성:
- 병합 커밋
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를 합침
2024.05.20 - [utils/git and github] - [Git] Git Summary (작성중)
'utils > git and github' 카테고리의 다른 글
[Git] push (0) | 2024.05.26 |
---|---|
[Git] Tutorial: 3-way merge, fast forward, and rebase (0) | 2024.05.26 |
[Git] merge: branch를 합침 (0) | 2024.05.26 |
[Git] git 에서 branch란? (0) | 2024.05.26 |
[Git] reset: 가장 쉬운 되돌리기. 단 공동작업에선 피하자. (0) | 2024.05.26 |