Git에서 브랜치를 병합할 때 새로운 커밋이 생긴다는 것은 잘 알려진 사실입니다.
오늘은 이 병합(Merge) 과정에서 발생하는 두 가지 주요 방식, Fast-Forward Merge와 3-Way Merge에 대해 깊이 있는 이야기를 해보겠습니다.
1. Merge 커밋이란?
먼저 Merge 커밋이 무엇인지 짚고 넘어가겠습니다.
Merge 커밋은 두 브랜치의 작업을 병합할 때 생성되는 특별한 커밋으로, 병합 결과를 기록합니다.
보통은 한 브랜치에서 다른 브랜치를 합칠 때 만들어지며, 두 브랜치의 변경사항을 모두 포함하게 됩니다.
2. Fast-Forward Merge: 새로운 커밋 없이 병합하기
Fast-Forward Merge는 새로운 커밋을 생성하지 않는 병합 방식입니다.
이 방식은 두 브랜치가 커밋 히스토리 상 같은 선상에 있을 때 적용됩니다.
예를 들어, master 브랜치가 premium 브랜치와 병합될 때, master 브랜치가 premium 브랜치의 끝으로 단순히 이동하면서 병합이 이루어집니다.
git merge premium
이렇게 하면 premium 브랜치의 마지막 커밋이 master 브랜치의 마지막 커밋으로 설정됩니다.
이 과정에서 새로운 커밋이 생성되지 않기 때문에 커밋 히스토리가 깔끔하게 유지됩니다.
3. 3-Way Merge: 새로운 커밋이 필요한 경우
Fast-Forward Merge가 불가능한 경우에는 3-Way Merge가 발생합니다.
이 방식은 브랜치 간에 커밋 히스토리가 분리된 경우, 즉 서로 다른 선상에 있을 때 사용됩니다.
3-Way Merge는 다음 세 가지 요소를 고려하여 새로운 Merge 커밋을 생성합니다.
- Base 커밋: 두 브랜치의 공통 조상 커밋.
- 현재 커밋: 병합할 브랜치의 최신 커밋.
- 병합할 커밋: 다른 브랜치의 최신 커밋.
Git은 이 세 커밋을 비교하여 병합 결과를 결정하며, 그 결과를 새로운 커밋으로 기록합니다.
예를 들어, master 브랜치와 premium 브랜치가 서로 다른 작업을 포함하고 있을 때, 병합 명령어는 다음과 같이 실행됩니다.
git merge premium
이 명령어를 실행하면 Git은 자동으로 두 브랜치의 변경 사항을 통합하고, 이를 새로운 Merge 커밋(A+B)으로 저장합니다.
4. Merge 결과 분석: 다양한 상황별 사례
아래 표는 다양한 상황에서 Merge가 어떻게 작동하는지 보여줍니다.
상황 Base Master Premium Merge 결과
Case 1 | A | A | B | B |
Case 2 | 1 | 2 | 1 | 2 |
Case 3 | "hello" | (공백) | "hello" | (공백) |
Case 4 | "bye" | "fighting" | "please" | Conflict 발생! |
- Case 1: Base와 동일한 내용을 가진 master와 변경된 premium이 있을 때, premium의 변경 사항이 적용됩니다.
- Case 2: master에서의 변경 사항이 premium보다 최신이기 때문에 master의 내용이 우선됩니다.
- Case 3: master에서 내용을 삭제했기 때문에, 병합 결과도 삭제된 상태가 됩니다.
- Case 4: 두 브랜치에서 모두 내용이 변경된 경우, Conflict가 발생하여 사용자가 직접 해결해야 합니다.
5. Fast-Forward와 3-Way Merge 요약
- Fast-Forward Merge: 브랜치가 같은 커밋 히스토리 선상에 있을 때 발생하며, 새로운 커밋이 생성되지 않습니다.
- 3-Way Merge: 브랜치가 서로 다른 커밋 히스토리를 가지고 있을 때 발생하며, 새로운 Merge 커밋이 생성됩니다.
이제 Git Merge의 두 가지 방식, Fast-Forward와 3-Way Merge에 대해 잘 이해하셨을 겁니다.
각 방식의 특징과 적용 상황을 기억해두면 Git을 더 효과적으로 사용할 수 있습니다!
공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Program Development Tips > Git' 카테고리의 다른 글
[Git] 협업 필수 지침: 왜 git push 전에 git pull이 필요한가? (0) | 2024.08.27 |
---|---|
[Git] Push의 숨겨진 기능: --set-upstream 옵션 완벽 해부 (0) | 2024.08.27 |
[Git] Reset과 Git Checkout: 차이점과 사용법 총정리 (0) | 2024.08.27 |
[Git] 브랜치와 origin의 의미: 브랜치와 리모트 저장소의 관계 (0) | 2024.08.27 |
[Git] Merge와 Conflict 해결: 여러 파일에서 충돌이 발생할 때의 해결 방법 (0) | 2024.08.25 |