코딩애플의 git 강의를 정리한 글입니다.
사실 기존의 merge 말고도 다양한 merge 방법들이 있습니다.

main 브랜치와 새로운 브랜치들이 각각 커밋이 있을때는 이렇게 3-way merge 방식으로 합쳐집니다.
커밋 하나를 생성하여 거기에 내용이 합쳐집니다.
기본적으로 merge를 할 때에는 이런 방식으로 merge가 됩니다.
만약 main 브랜치에는 신규 커밋이 없고 새로운 브랜치에만 커밋이 있을 경우 fast-forward merge가 진행됩니다.
굳이 새로운 커밋을 만들 필요가 없으므로 새로운 브랜치가 main 브랜치로 바뀝니다.

요렇게 새로운 브랜치가 main 브랜치로 바뀝니다.
만약 죽어도 3-way merge를 해야하는 경우에는
git merge --no-ff 브랜치명
으로 강제로 3-way merge를 진행할 수 있습니다.

말 그대로 베이스를 옮긴다는 뜻 입니다.
이렇게 베이스를 옮겨서 fast-forward merge를 할 수 있습니다.
굳이 왜 하냐구요??
- 강제로 fast-forward merge를 하고 싶을 때
- 간지나게 merge 하고 싶을 때
- 사실은 나중에 log 볼 때 눈물을 흘릴 수 있기 때문에
사용 방법을 알아보면
- 새로운 브랜치로 이동
- rebase 진행
- merge 진행 (그럼 자동으로 fast-forward merge가 되겠죠???)
git switch 새로운브랜치명
git rebase main
git switch main
git merge 새로운브랜치명

이랬던 브랜치들이

이렇게 깔끔하게 rebase되어 합쳐졌습니다.(개고수 같아보임)
다만 기존 base 커밋과 rebase하려는 커밋이 차이가 많이 날 경우 무수한 악수 요청이 올 수 있으니 주의해야 합니다.
위에서 말한대로 대충 다 3-way merge 해버리면 로그에 합쳐진 브랜치의 커밋내역까지 다 보여줘서 나중에 로그보고 눈물 흘립니다.
이런 불상사를 막기 위해서는 rebase 하던가 squash and merge 하면 됩니다.
이런거 쓰면 새로운 브랜치에 있던 커밋들을 메인 브랜치에 붙여주기 때문에 깔끔해집니다.
그럼 squash and merge는 어떻게 하냐
대충 이런 방식입니다.
rebase and merge 와 차이점은 새로운 브랜치에 있던 커밋들을 하나에 커밋에 합쳐서 보낸다는 것입니다.
이게 왜 좋은지는 나중에 취업해서 경험해보겠습니다.
하는 방법은
git switch main -> main 브랜치로 이동
git merge --squash 새로운브랜치명 -> squash and merge 진행
git commit -m '메시지' -> commit 진행