참조 애플코딩: (무료) 매우쉽게 알려주는 git & github

브랜치에 각각 신규 commit이 1회 이상 있는 경우, merge 명령을 내리면 두 브랜치의 코드를 합쳐서 새로운 commit을 자동으로 생성해주는 것
이것이 merge의 기본 동작방식
commit2시점에서commit2-1이라는 신규 브랜치를 만들고
그 이후 각각commit3,commit2-2라는 신규 커밋이 1회 이상 생겼을 때merge를 해주는 것이3-way-merge이다.

새로운 브랜치에만 commit이 되어있고
기준이 되는 브랜치에는 신규 commit이 없는 경우가 있는데,
이럴 경우 merge하게 되면
"fast-forward merge 되었습니다" 라고 알려줌
기준이 되는 브랜치에 새롭게 합칠 것이 없어서 분리된 브랜치를 메인 브랜치처럼 다루는 것
만약, fast-forward merge가 싫다면
git merge --no-ff 브랜치명
를 사용하여 강제로 3-way merge할 수도 있음
위의 두 가지 방법으로 merge를 하더라도 브랜치가 자동으로 삭제되진 않는다
git branch -d 브랜치이름
git branch -D 브랜치이름
둘 중 하나를 사용하면 필요없는 브랜치를 삭제할 수 있다
병합이 완료된 브랜치를 삭제할 땐 -d만 사용해도 되는데
병합하지 않은 브랜치를 삭제할 땐 -D를 사용해야 한다.

rebase는 브랜치의 시작점을 다른 commit으로 옮겨주는 행위다
rebase를 이용하여 신규 브랜치의 시작점을 main 브랜치 최근 commit으로 옮긴 다음fast-forward merge를 하는 것
3-way merge말고 강제로fast-forward하고 싶을 때- 브랜치 없이도 코드를 잘 짜는 고수 느낌을 주고 싶을 때
rebase & merge를 사용한다
fast-forward merge 하면 됨git switch 새로운브랜치
git rebase main
git switch main
git merge 새로운브랜치
main 브랜치 뿐만 아니라 다른 브랜치끼리도 가능함
단, 브랜치끼리 차이가 너무 많은 경우에 rebase를 하게 되면 충돌이 많이 발생할 수 있음
모든 브랜치를 3-way merge해버리면 이후에 문제가 생길 수도 있음

그게 싫을 경우,
rebase 또는 squash and merge하면 됨
위와 같이 사용하면 새로운 브랜치에 있던 commit들을 연결해주는 것이 아니라 똑 떼와서 main 브랜치에 붙여주기 때문에
1번과 2번 걱정을 하지 않아도 됨
squash and merge를 하게 될 경우,
3-way merge처럼 선으로 이어주지 않고
새 브랜치에 있던 코드변경사항들이 main 브랜치로 순간이동함

main 브랜치의 git log를 출력해볼 때
merge 완료된 브랜치의 commit 같은 것들은 출력되지 않음 (훨씬 깔끔)
git switch main
git merge --squash 브랜치명
git commit -m '메세지'
git merge 뒤에 --squash 옵션 추가하면 됨

▲ 그냥 merge 했을 경우

▲ merge --squash 했을 경우
정말 좋은 정보 감사합니다!