branch merge란
현재 branch에서 다른 branch를 합칠 때 사용합니다.
특정 branch로 합치게 해달라고 요청하는 pr(pull request)에도 아래와 같이 세 가지 merge 방법 중 하나를 선택할 수 있습니다.
왜 이렇게 다른 세 가지 방법 중 하나를 선택할까요? 커밋 메세지, 커밋 그래프를 어떻게 유지해야 할지와 연관되어 있기 때문입니다. 세 가지 merge 방법의 특징을 아래에서 살펴 볼게요.
Merge
- 일반적으로 많이 사용하는 merge 방법이며, 커밋 이력을 모두 남길 때 사용합니다.
- 장점이자 단점은 모든 커밋과 분기했던 branch 히스토리가 남는다는 점입니다.
Fast-forward 설정이란?
git merge
는 —ff
옵션(fast-forward)이 기본으로 설정되어 있는데, 이는 Base 브랜치가 이후 변경 내용이 없는 최신 브랜치일 경우 병합한다는 커밋 없이 합치고, 그렇지 않을 경우 병합 커밋을 남기고 합칩니다.(참고)
Github의 Merge pull request는 git merge -—no-ff
옵션으로 Base 브랜치가 최신 브랜치라 할지라도 커밋을 남기도록 강제 합니다.
Squash & Merge
git merge
에 -squash
옵션을 추가한 방법입니다.
- 분기했던 branch에 있던 내용 a, b, c 커밋을 모두 합쳐 하나의 새로운 커밋을 만듭니다.
- 지저분한 커밋 히스토리들을 하나로 합쳐서, 기능상 의미있는 하나의 커밋만 남길 때 사용합니다.
- 잘못 사용해 과도한 생략을 하게 되면, 추후 변경 파악이 힘들 수 있습니다.
Rebase & Merge
- 분기했던 branch의 기준을 최신 Base로 설정하고, merge하는 방법입니다. 결과적으로는
git merge -ff
와 같은 형태가 됩니다.
- rebase를 하면 커밋들의 Base가 변경돼 커밋 해시 또한 변경 될 수 있습니다. 이런 경우
git push -f
(force push)해야할 경우도 있습니다.
- 머지 커밋을 남길 필요가 없는 merge의 경우 사용하면 좋습니다.
- 커밋 그래프가 하나의 라인으로 그려져 가독성에 좋습니다.
언제 어떤 걸 사용할까?
branch 전략에 따라 달라질 수 있고, 아래는 Git Flow를 기준으로 얘기한 내용입니다.
- 특정 기능 개발 후 develop branch에 merge하고자 할 때는 Squash and Merge가 유용할 수 있습니다.
- develop branch를 production branch로 merge하고자 할 때는 develop branch에 분기가 남아있다면, production branch는 간결하게 유지하고자 Rebase and Merge가 유용할 수 있습니다.
참고