브랜치를 합칠 때 다양한 방법으로 합칠 수 있습니다.
브랜치에 각각 신규 commit이 1회 이상 있는 경우 merge 명령을 내리면,
두 브랜치의 코드를 합쳐서 새로운 commit을 자동으로 생성해주는데,
이걸 3-way merge라고 부릅니다. 이게 merge의 기본 동작방식입니다.
새로운 브랜치에만 commit 이 있고 기준이 되는 브랜치에는 신규 commit 이 없는 경우,
merge 하게 되면 "fast-forward merge 되었습니다" 라고 알려줍니다.
3-way, fast-forward 아무렇게나 merge 해도, 브랜치를 merge 하고 나면 브랜치가 자동으로 삭제되진 않습니다.
git branch -d 브랜치이름 # 병합(merge)이 완료된 브랜치 삭제
git branch -D 브랜치이름 # 병합(merge)하지 않은 브랜치 삭제
브랜치를 rebase 하고 나서 merge하는 것도 가능합니다.
rebase는 브랜치의 시작점을 다른 commit으로 옮겨주는 행위입니다.
이렇게 하는 이유
일반 3-way merge 대신 rebase & merge 해도 됩니다. 그래서 실제로 rebase and merge 하고 싶으면
git rebase main하면 됩니다. # reabse & merge 하고 싶으면
git switch 새로운브랜치 # 1. 새로운 브렌치로 이동
# 신규 브랜치의 커밋들을 main 브랜치의 최근의 commit으로 옮김
git rebase main # 2. git rebase 중심브랜치명
# main 브랜치로 이동해서 fast-forward merge 수행
git switch main
git merge 새로운브랜치
차례로 입력하면 rebase 끝입니다. rebase & merge를 한 줄로 쉽게 비유하자면 강제 fast-forward merge입니다.
직접 새로운 브랜치 만들고 commit 몇 번 하고 rebase 해봅시다.
물론 단점도 있는데, 브랜치끼리 차이가 너무 많은 경우 rebase하면 충돌이 많이 발생해서 해결하기 귀찮음
모든 브랜치를 3-way merge 해버리면 나중에 참사가 일어날 수 있습니다.
왜냐면 다음과 같은 현상이 있습니다.
이러기 싫으면 rebase아니면 squash and merge하면 됩니다.
새 브랜치에 있던 commit 들을 연결해주는게 아니라 떼와서 main 브랜치에 붙여주기 때문에1번과 2번걱정을 안해도 됨
rebase는 아까 배웠고, squash and merge이거 하면 어떻게 되냐면,
3-way merge처럼 선으로 이어주지 않고, 새 브랜치에 있던 코드 변경사항들이 main 브랜치로 텔레포트합니다.
그럼 이제 main 브랜치의 git log 출력해볼 때, merge 완료된 브랜치의 commit 같은 것들은 출력되지 않습니다.
git switch main
git merge --squash 브랜치명 # squash merge
git commit -m '메세지'
squash and merge하는 법은 그냥 --squash옵션을 추가하면 끝입니다.
브랜치에서 만들어놨던 많은 commit들을 다 합쳐서 하나의 commit으로 main 브랜치에 생성해줍니다.
merge를 잔뜩 해놓으면 나중에 git log 그래프가 매우 복잡해질 수 있습니다.
그게 싫으면 squash해보십시오. 또는 rebase 해도 마찬가지로 해결가능합니다.
보통 회사 프로젝트마다, 브랜치마다 merge 방법 가이드라인이 있습니다.