-
[Git] Git의 다양한 merge 방법 이해하기 (Merge / Squash & Merge / Rebase & Merge)📖 개발 공부/git 2023. 5. 28. 16:13
Merge
커밋 이력을 모두 남길 때 사용한다. 일반적으로 많이 사용된다.
두 개 이상의 브랜치를 병합하여 새로운 커밋을 만든다. 병합 커밋은 두 브랜치의 변경 내용을 모두 포함하며, 두 브랜치의 변경 내용이 충돌할 경우 사용자가 충돌을 해결해야 한다.
merge를 사용하면 병합된 커밋 히스토리가 남기 때문에 브랜치 간의 관계가 명확하게 나타난다.
여기엔 두가지 옵션이 있다.
fast-forward 옵션
- 대상 브랜치의 최신 커밋이 현재 브랜치의 커밋을 포함하고 있는 상태로 브랜치 포인터(각 브랜치의 최신 커밋을 가리키는 참조)를 이동시킨다.
- fast-forward 병합은 병합 대상 브랜치의 커밋 히스토리가 현재 브랜치의 커밋 히스토리에 뒤쳐져 있을 때 사용된다. 이 경우, 단순히 현재 브랜치를 대상 브랜치로 이동시키면 되므로 별도의 커밋이 생성되지 않는다.
recursive 옵션- recursive 방식은 두 브랜치의 공통 조상 커밋을 기준으로 변경 내용을 비교하고, 충돌이 발생하는 경우 사용자에게 충돌 해결을 요구한다.
- recursive 병합은 merge 작업을 수행하는 가장 기본적인 방식이다. 이 방식은 병합 커밋을 생성하여 두 브랜치의 변경 내용을 하나로 통합한다.
각 브랜치의 변경 내용이 모두 병합 커밋에 포함되기 때문에 커밋 히스토리가 상대적으로 더 복잡해질 수 있다. 하지만 브랜치 간의 관계와 개별적인 커밋을 보여줌으로써 변경 내용을 이해하기 쉽게 해준다.
Squash & Merge
squash & merge는 병합할 브랜치의 모든 커밋을 하나로 압축하여 하나의 새로운 커밋을 만드는 방법이다.
이 방법을 사용하면 브랜치의 모든 변경 내용을 하나의 커밋으로 합칠 수 있다. 따라서 브랜치의 커밋 히스토리가 깔끔하게 유지된다. squash & merge는 기능적인 변경 내용을 한 번에 확인하고 리포지토리의 커밋 히스토리를 깔끔하게 유지하고자 할 때 유용하다.
- 장점
- 커밋 히스토리를 깔끔하게 유지할 수 있다. 모든 브랜치의 커밋을 하나의 압축된 커밋으로 합치므로, 커밋 히스토리가 간결하고 읽기 시워진다.
- 기능 단위로 변경 내용을 파악하기 쉽다. 각 기능이나 작업 단위별로 커밋을 합치므로, 변경 내용을 명확하게 구분할 수 있다. 이는 변경 내용의 의도와 목적을 잘 표현할 수 있다.
- 단점
- 개별적인 커밋의 히스토리가 손실된다. 커밋을 압축하면 개별 커밋의 이력이 사라지므로, 특정 커밋의 변경 내용을 추적하기가 어려워진다.
- 다른 개발자와의 협업이 어려울 수 있다. squash & merge를 사용하면 커밋 히스토리가 변경되므로, 다른 개발자들이 해당 브랜치를 기반으로 작업할 때 문제가 발생할 수 있다.
Rebase & Merge
rebase & merge는 병합할 브랜치의 커밋을 현재 브랜치의 최신 커밋 위에 재배치(rebase)하여 병합하는 방법이다.
이 방법은 브랜치의 커밋 히스토리를 선형으로 유지할 수 있도록 도와준다. 또한 병합된 커밋 히스토리가 더 깔끔해지고 이해하기 쉬워진다.
- 장점
- 커밋 히스토리를 선형적으로 유지할 수 있다. 병합된 커밋이 현재 브랜치의 최신 커밋 위에 재배치되므로, 커밋 히스토리가 단순하고 직관적으로 유지된다.
- 변경 내용을 명확하게 이해하기 쉽다. 커밋이 선형적으로 정렬되므로, 변경 내용을 단계별로 파악하고 이해하기 용이하다.
- 충돌 해결이 비교적 쉽다. rebase 작업을 통해 충돌이 발생하면, 해당 커밋 단위로 충돌을 해결하면 된다
- 단점
- 커밋 히스토리를 변경하므로 주의가 필요한다. rebase & Merge 작업은 커밋 히스토리를 재배치하고 변경하기 때문에, 이미 공유된 커밋 히스토리에 대한 변경이 발생한다. 다른 개발자들이 해당 브랜치를 기반으로 작업하는 경우에는 커밋 히스토리의 변경으로 인해 문제가 발생할 수 있다.
🔗 참고
반응형'📖 개발 공부 > git' 카테고리의 다른 글
[Git] Git 커밋 되돌리는 다양한 방법 (git reset / git revert) (0) 2023.07.14 [Git] commit을 변경하는 git commands (0) 2023.05.14