Merge, Rebase, Squash?
어떠한 작업을 진행 한 후 기존의 브랜치와 병합을 해야할 떄가 온다.
이때 Merge를 하려고 보면 3가지 옵션이 주어지는데 이들의 차이를 정리하기 위해 글을 작성한다.
!! 해당 게시물은 개인 공부용으로 틀린 내용이 있을 수 있습니다 !!
기본적으로 origin branch 와 dev branch가 아래와 같이 존재한다고 하자.
현재 개발자는 dev branch에서 작업을 마쳤으며 origin branch에 작업한 것을 적용하고 싶어한다.
이 때, 개발자가 행할 수 있는 방식은 3가지이다.
1. Merge
위의 경우는 dev branch를 origin branch에 merge한 경우이다.
- Merge를 진행한 경우 dev branch에서 작업한 것들이 마지막 origin branch와 합쳐지는 말 그대로 병합이 일어난다.
- 다만 두 개의 branch에서 같은 파일을 다르게 수정하였을 경우 merge 시점에서 둘 중 어느 것을 따라갈지 지정을 해주어야 한다.
→ 이는 commit 시간에 따라 적용 된 후 마지막에 Merge Commit 과정을 거쳐 일어나게 된다.
- Merge 이후에도 dev branch의 기록이 남아있다.
2. Rebase and Merge
- Rebase and Merge의 경우 origin branch에서 진행한 commit, dev branch에서 진행한 commit이 합쳐지는 것이 아닌 origin branch의 마지막 commit 뒤에 이어 붙는 형식이다.
- 이 경우 2개의 branch가 아닌 단일 branch로 인식하게 된다.
- 충돌 확인 과정인 Merge Commit이 따로 존재하지 않고 dev branch가 생성 된 이후의 origin branch의 commit과 하나하나 대조하여 충돌 확인이 일어나게 된다.
3. Squash and Merge
- Squash and Merge의 경우 dev branch에서 진행된 commit들을 하나의 commit으로 만들어 origin branch에 merge한다.
- 이 경우 여러 commit들이 하나의 commit으로 합쳐질 때 Merge Commit을 진행하게 된다.
그래서 무엇을 써야해?
- 선택 기준은 Commit History를 어떻게 남길 것인가 라고 이해하였다.
- 정확한 Merge 시점을 나중에도 찾아볼 것 같다 → Merge
- 브랜치 정리를 진행하면서 Commit History를 최대한 유지하고 싶다 → Rebase
- Commit History를 최대한 깔끔하게 하나로 뭉치고 싶다 → Squash
Reference