1. 3-way merge
2. fast-forward merge
3. rebase and merge
4. squash and merge
3-way merge은 두 브랜치 중에 한 곳의 브랜치에서 변화가 있다면 모두 가능하다.
fast-forward merge와의 차이는 히스토리가 로그가 분기된다는 것.
fast-forward merge는 기준 브랜치는 변화가 없어야하고, 사이드 브랜치의 변화가 있을 때 진행된다.
기준 브랜치가 사이드 브랜치를 참조하게 만드는데, 이는 merge가 아니라 포인터 이동이므로 merge커밋이 생성되지 않는다. 그러므로 히스토리를 기준 브랜치의 선형으로 이어갈 수 있다.
fast-forward와 rebase의 차이는?
fast forward, rebase 모두 최신 메인 브랜치에 커밋을 하는 것이기 때문에 사실 큰 차이는 없다. 가장 큰 차이라면 fast forward merge는 메인 브랜치에 신규 커밋이 있으면 못하지만 rebase는 가능하다는 것.
fast forward는 자동이지만 따로 rebase까지 하는 이유는 모든 커밋을 3-way merge하면 로그 히스토리가 굉장히 복잡해지기 때문이다. 단점은 사이드 브랜치의 커밋을 메인 브랜치에 이어붙이기 때문에 conflic 엔딩이 많이 발생할 수 있다.
git merge --squash: squash and merge를 하면 사이드 브랜치의 커밋들을 한번에 모아서 메인 브랜치의 최신 커밋 이후로 붙여준다.
rebase처럼 main 브랜치에서 log 출력하면 사이드 브랜치의 자잘한 히스토리들이 출력되지 않는다. 결국 두 방법 모두 메인 브랜치의 히스토리를 깔끔하게 유지하고 싶을 때 사용한다.
merge conflict 해결하기
충돌이 발생하면 최종적으로 어떤 브랜치의 내용을 반영할지 내가 직접 선택해야한다.