Merge 알아보기
git checkout feat/1
git merge develop
1. Fast-Forward
새로운 브랜치 ‘feat/1’가 develop 브랜치로부터 분기된 이후 develop 브랜치에 새로운 커밋이 올라오지 않았다면, ‘feat/1’ 브랜치가 develop 브랜치와 비교했을 때 최신의 브랜치라 할 수 있습니다.
Git-flow 방식으로 develop 브랜치에서 새 브랜치로 분기하면서 개발하는 경우
이런 경우 ‘feat/1’의 변경 이력을 그대로 develop으로 합치는 것이 Fast-forward Merge입니다.
2. Recursive (재귀적)
‘feat/1’ 브랜치가 develop 브랜치에서 분기 되고 develop 브랜치에 새로운 커밋이 생겼다면,
‘feat/1’를 최신 브랜치라고 간주할 수 없습니다. (더 이상 fast-forward merge가 아님)
따라서 ‘feat/1’ 브랜치와 develop 브랜치를 공통 부모로 한 새로운 Merge Commit을 생성하게 됩니다. 이러한 방법을 Recursive Merge라고 합니다.
Squash and Merge (밀어 넣다, 찌부러뜨리다)
Squash는 여러 개의 커밋을 하나의 커밋으로 합치는 것을 의미합니다.
(a, b, c 를 합쳐서 새로운 커밋을 만들고, Merge 대상 브랜치에는 합쳐진 커밋 Init 하나만 가짐)
Squash Merge는 병합할 브랜치(feat/1)의 모든 커밋을 하나의 커밋으로 Squash 한 새로운 커밋을 Base 브랜치(develop)에 추가하는 방식으로 병합하는 것을 의미합니다.
→ 여러 개의 커밋을 하나의 커밋으로 Squash 하므로 Git Commit 내역들을 깔끔하게 관리할 수 있습니다.
git checkout feat/1
git merge --squash develop
git commit -m "Squash and Merge"
feature → develop Merge 시 Squash and Merge가 유용합니다.
feature 브랜치에서 기능을 개발하기 위한 지저분한 커밋 내역을 하나의 커밋으로 묶어 develop 브랜치에 병합하면서, develop에는 기능 단위로 커밋이 추가되도록 정리할 수 있습니다.
(feature 브랜치는 develop 브랜치에 병합 후 제거되므로, Merge Commit을 남길 필요가 없습니다.)
Rebase And Merge
Rebase - base 의 차이를 알고 있어야 위 Merge 방법을 이해하는데 쉽습니다.
develop 브랜치의 Base는 main 브랜치의 Init 커밋에서 분기되었다고 가정하면, Init 커밋입니다.
Rebase는 말 그대로 Base를 다시 설정하는 것을 말합니다. 이전에 수행되었던 commit a, b, c 간의 관계를 그대로 유지하면서 main 브랜치(병합하려는 브랜치)에 추가하는 것입니다.
commit a는 main 브랜치의 이전 커밋인 commit e를 부모로 가지게 됩니다.
Rebase and Merge 작업 이후에는, 이전에 존재했던 a, b, c commit 내역에서 main 브랜치의 init, d, e, a, b, c commit 내역으로 변경됩니다.
git checkout develop
git rebase main
git checkout main
git merge develop
develop → main Merge 시에는 Rebase And Merge가 적합하다.
main 브랜치에는 지금까지 작업한 모든 기능을 배포할 때 Merge(병합)합니다.
develop 브랜치를 Squash and Merge 하게 되면 커밋 이력이 모두 사라져, 특정 기능에서 문제가 생겼을 때 롤백할 수 없게 되는 단점이 있습니다.
main 브랜치 또한 Merge Commit을 남길 필요가 없으며, Commit 내역을 깔끔하게 나타내기 위해 Rebase And Merge를 사용할 수 있습니다.
'Git' 카테고리의 다른 글
[Git] Git reset, revert 이용해서 commit 없애기, 되돌리기 (0) | 2024.11.11 |
---|---|
[Git] Git branch, switch, merge, rebase 사용하기 (1) | 2024.02.05 |
[Git] Git branch 사용법 및 브랜치 관리하기 - git branch, git checkout (0) | 2023.08.12 |
[Git] git push를 하려 할 때 '[rejected] main -> main (fetch first) error: failed to push some refs to' 에러 해결 방법 (0) | 2023.07.23 |
[Git] 깃허브에 폴더 및 파일 올리기 - git 필수 명령어 정리 (0) | 2023.02.07 |