[Git/Github] Merge, Squash and Merge, Rebase and Merge란? 비교 및 개념정리



0. 공통환경

기존에 제가 알고 있는 git은, 사용할 때 단순히 merge 만 사용해서 충돌을 해결했습니다. 하지만 공부하다보니 다양한 전략이 있는 것으로 확인되어 내용을 정리해보았습니다.

위와 같은 단순 Merge 방식은 직관적으로 이해하기 편하지만, 사람들이 많아지게 되고 commit과 branch가 많아지게 되면 복잡도가 높아지고, 단순히 Merge를 했을 때 보기가 어렵다는 문제가 발생합니다. 따라서, 팀과 상황마다 다른 전략을 취하게 되었고 대표적인 전략이 하기의 3가지입니다.

  • Merge
  • Squash and Merge
  • Rebase and Merge

위 3가지 전략의 차이를 확인하기 위해서 먼저 환경 세팅을 해주었습니다. 환경은 아래와 같이 세팅하였습니다.

  • feature/a branch : 생성 후, a1, a2, a3 3개의 커밋을 만들었습니다.
  • master branch : a1, a2, a3 커밋을 생성한 후에 master2, master3 커밋을 만들었습니다.

image

1. Merge

우리가 흔히 알고 있는 Merge 방식입니다. master 에서 feature/a 브랜치를 merge하게 되면, 두 브랜치는 이어지게 됩니다. git merge feature/a를 입력하면 Merge commit 에 관련된 comment를 작성하게 되고, 새로운 commit 이 생성됩니다.

$ git checkout master
$ git merge feature/a  

image

2. Squash and Merge

Squash merge 를 진행하게 되면 기존의 a1, a2, a3 commit 전부를 합친 (a1 + a2 + a3) 하나의 commit이 master 앞에 붙게 됩니다. 여러개의 commit을 master branch 바로 앞에 단 하나의 commit(예제에서 commit : squash merge)으로 가져올 수 있고, merge와 다르게 feature/a 브랜치와 master 브랜치는 이어지지 않습니다.

$ git checkout master
$ git merge --squash feature/a
$ git commit -m "squash merge"

image

3. Rebase and Merge

Rebase는 위 2개의 명령어와 다르게 feature/a 에서 명령어를 수행합니다. master 에 대하여 rebase 를 수행하면, 기존 Master 앞에 feature/a 브랜치에 있었던 내용들이 전부 master 앞으로 재배치 되게 됩니다. 이 때, feature/a 브랜치는 a3 commit이 최신이고, master는 master3 commit 에 위치하고 있습니다.

$ git checkout feature/a
$ git rebase master
$ git commit -m "squash merge"

image

4. 추가

  • rebase 를 하고 remote push : rebase 시점에서 충돌을 내가 해결하고 문제 확인 가능
  • squash merge: push 시점에서 충돌이 나서 문제가 될 수 있다.

reference