Learn/Git

[Git] Git Merge / Squash / Rebase 구분

앤오엔 2022. 4. 13. 19:49

Github이나 Gitlab에서 협업 프로젝트를 하면

개인이 작업한 Feature branch 에서 master 나 main 등 하나의 branch로 통합은 필수적이다.

이 과정에서 Pull Request (Gitlab에서는 Merge Request) 을 하게 되는데,

Merge, Squash, Rebase 등의 단어들이 자주 등장한다.

 

분명 차이가 있어 사용하고 앞으로도 종종 마주치게 될 것 같아 따로 정리해둔다.

 


 

현재 브랜치 분기 상태는 다음과 같고, bugfix 브랜치를 master 브랜치와 통합하는 것이 목적이다.

· master 브랜치 B지점에서 새로 bugfix 브랜치를 만들어 X, Y 커밋 진행

· master 브랜치 역시 병렬적으로 C, D 커밋 진행

 

 

 

 

Merge

Merge commit

기존에 작업한 bugfix 브랜치의 변경 내용과 master 변경 내용을 모두 남기면서 'E' 라는 새로운 merge commit 이 생기면서 통합된다.

 

$ git checkout master
$ git merge bugfix
$ git commit -m "merge"

 

 

Squash and Merge

 

Squash

기존에 작업한 bugfix 브랜치의 변경 내용 (X, Y)을 X+Y 라는 새로운 커밋으로 master 브랜치에 추가하며 통합된다. 

 

$ git checkout master
$ git merge --squash bugfix
$ git commit -m "squash and merge"

 

 

 

Rebase and Merge

 

 

Rebase

기존에 작업한 bugfix 브랜치의 변경 내용이

master 브랜치의 뒤에 이동해 마치 원래 master 하나의 브랜치 였던 것 처럼 통합된다.

 

 

$ git checkout bugfix
$ git rebase master
$ git checkout master
$ git merge bugfix

 

 

 

 

 

<요약 및 정리>

Merge: 두 개의 브랜치 변경 내용의 이력이 모두 그대로 남아있고 Merge commit 내역도 생성됨
Squash: 기존 브랜치는 없어지고, parent 브랜치의 이력에 기존 이력들이 통합된 새 Merge commit 내역이 생김
Rebase: 기존 브랜치는 없어지고, parent 브랜치의 이력으로 합쳐지며 Merge commit 내역은 생기지 않음

 

 

 

 

참고

https://backlog.com/git-tutorial/kr/stepup/stepup1_4.html

- https://backlog.com/git-tutorial/kr/stepup/stepup6_6.html

- https://im-developer.tistory.com/182