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