브랜치마다 신규 커밋이 하나 이상 있는 경우. 새로운 커밋을 생성하면서 합쳐준다. 이러한 유형을 3-way merge
라고 한다.
메인브랜치에 신규 커밋이 없는 경우. 그냥 브랜치의 최신 커밋을 main브랜치로 하기로 한다. 이러한 유형을 fast-forward merge
이라고 한다.
fast-forward merge되는 게 싫으면, git merge —no-ff 브랜치명
을 사용해서 강제로 3-way merge를 할 수도 있다.
git merge —no-ff 브랜치이름 // fast-forward merge 될 것을 강제로 3-way-merge
브랜치의 원래 시작점은 commit2인데, commit3로 바꿔주었다.
: rebase를 쓰는 이유는 만약 브랜치가 1000개 정도 되는데 모두 3-way-merge를 해버리면 git log를 출력해보았을 때 너무 복잡해지기 때문에, 간단한 브랜치들은 rebase를 하는 경우가 많다. 이렇게 할 경우 훨씬 깔끔해보인다.
단점은 브랜치끼리 차이가 너무 많은 경우 conflict가 많이 발생할 수 있다.
git switch 새로운브랜치
git rebase main
git switch main
git merge 새로운브랜치
squash and merge는 순간이동에 비유할 수 있다. 기존의 브랜치는 흔적까지 모두 없애고, 중심 브랜치에 새로운 커밋을 하나 생성해주는 것이다.
3-way merge를 다 해버리면 main브랜치의 gitl log를 출력해봤을 때, 자잘한 커밋들 메시지도 출력이 되는 것들을 볼 수 있다.
그렇게 되지 않으려면 중간의 연결되는 선을 끊어주면 되는데, 이것을 해주는 것이 Squash and merge이다.
그림으로 표현하자면 아래와 같이 되어 사이드 브랜치에서 개발했던 자잘한 로그들이 출력이 되지 않는다.
3-way merge를 남발하게되면 commit 내역들이 나중에 매우 더럽고, 복잡해보인다.
main 브랜치 git log를 출력해보면 3-way merge된 브랜치들의 commit 내역도 다 같이 출력되어있을 것이다.
git switch main
git merge --squash 브랜치명
// 브랜치에서 만들어놨던 많은 commit 을 다 합쳐서 하나의 commit으로 main 브랜치에 생성함
git commit -m '메세지'
참고문헌 : 코딩애플