1. Merge Commit
- 가장 기본적인 브랜치 병합 방법.
- 각 브랜치의 변경사항이 과거의 커밋으로 보존되고, 새로운 커밋이 추가되어 최종 병합이 완료.
- 기본적으로 Fast-forward 또는 3-way merge 방식으로 병합된다. (맨 아래에서 설명)
- 장점 :
- 브랜치의 히스토리를 모두 유지하면서 변경사항 병합 가능.
- 프로젝트의 진행상황 이해/추적 쉬움.
- 커밋아이디가 바뀌는 경우가 없어 squash, rebase에 비해 사용이 쉽다.
- 단점 :
- 커밋히스토리가 복잡해질 수 있다.
- 팀이 커질수록 복잡성을 빠르게 증가한다.
- 사용 : 주로 안정적인 작업 플로우에서 사용하며, 빠른 병합이 가능한 경우에 유용하다.
2. Squash and Merge
- 각각의 커밋에서 발생한 모든 변경 사항을 병합 후 하나의 새로운 커밋을 생성한다.
- 주로 Pull Request나 Merge Request에서 사용되며, 히스토리를 깔끔하게 유지하면서도 다수의 커밋을 하나로 묶을 수 있다.
- 장점 :
- 커밋히스토리를 간단하게 유지할 수 있다.
- 각 커밋이 특정 Pull Request를 대변하게되어, 커밋 하나하나가 완성된 기능을 의미하게 된다.
- PR에서 발생한 자잘한 문제를 숨기고 중요한 내용들만 압축할 수 있다.
- 단점 :
- 상세한 이력을 볼 수 없다.
- 각 커밋의 개별 맥락, 작업자의 정보등을 확인할 수 없다.
- (하지만 github에는 커밋기록이 남아있기때문에 작업 히스토리 확인 가능)
- 사용 : 작업 히스토리를 깔끔하게 유지하거나 다수의 작은 커밋을 하나로 통합할 때 사용된다.
3. Rebase and Merge
- 현재 브랜치의 커밋을 다른 브랜치의 마지막 커밋 위에 적용하여 히스토리를 깔끔하게 유지한다.
- 커밋의 시관에 관계없이 가장 뒤에 붙여서 새로운 커밋 히스토리를 만든다.
- 장점 :
- 깨끗하고 선형적인 커밋 히스토리를 만든다.
- 히스토리 파악 및 코드 변화의 이해가 쉽다.
- 단점 :
- 관련 커밋의 ID들이 모두 바뀌어 혼란을 초래할 수 있다.
- 브랜치가 크게 분기된 경우 더 복잡하고 어려울 수 있다.
- 여러 개발자가 동시에 작업을 수행한 경우 복잡한 충돌을 일으킬 수 있다.
- 다른 기능으로 나뉘어 있던 작업이력이 합져지므로, 특정 기능이 어디부터 어디까지의 커밋으로 구현되어있는지 알기 어렵다.
- 사용 : 작업 히스토리를 정리하고 선형적으로 보이게 만들 때 또는 다른 브랜치의 변경사항을 현재 브랜치에 적용하려고 할 때 사용된다.
4. Cherry-Pick
- 특정 커밋을 다른 브랜치로 가져오는 방법.
- 선택적으로 원하는 변경사항만을 가져올 수 있다.
- 사용 : 특정 커밋을 다른 브랜치로 병합하거나 특정 변경사항만을 다른 브랜치로 이동시키려고 할 때 사용된다.
Fast-forward
- 두 브랜치가 공통으로 가지고 있는 commit을 Base 라고 한다.
- master와 dev1이 각각 참조하는 commit이 동일선상에 위치해 있을 때, 두 브랜치가 fast-forward 상태에 있다고 한다.
- 두 브랜치가 fast-forward관계일 때 git merge 명령을 입력하면 새로운 commit이 생기지 않는다.
- 뒤쳐진 브랜치(master)의 참조개체가 앞서있는 브랜치가 가리키는 커밋을 참조하도록 이동할 뿐이다.
- 브랜치를 빨리감기하듯 이동시키는 모습을 본따 fast-forward(빨리감기)라고 부른다.
3-way merge
- 두 브랜치가 base로부터 commit을 진행해서 분기해나간 상태가 되었다.
- 두 브랜치 중 어느 것도 base에 위치해있지 않다.
- 이 때 git merge명령을 실행하면 새로운 commit이 생성된다.
- base커밋, master 커밋, dev1커밋 총 3개의 커밋을 보고 merge하기때문에 3-way merge라고 한다.
- 변경사항을 기준으로 자동병합을 진행하는데, 두 커밋 모두에서 변경사항이 발생한경우 conflict가 발생한다.
참조:
'Git' 카테고리의 다른 글
Git/GitHub Flow 브랜치 전략 (1) | 2023.09.15 |
---|---|
Git / GitHub (정의, 시작하기) (0) | 2023.09.13 |
크라켄, 이클립스 관련 (0) | 2023.03.13 |
Git/ Github (0) | 2023.03.13 |