Git 브랜치 3가지 Merge 전략 (Squash, Rebase, Merge)

Posted by , October 28, 2022
git

이번 포스팅에서는 Squash 에 대해 알아보겠습니다. 지난 포스팅에서 살펴본 Rebase 와 함께 커밋 히스토리를 관리하기 위한 방법 중 하나로써, Merge 할때 사용된다고 보시면 됩니다.

본 포스팅의 내용 흐름은 Squash 에 대한 이론을 설명드리고, 3가지의 Merge 전략(Merge, Squash and Merge, Rebase and Merge) 들의 특징을 비교하는 방식으로 진행해 보겠습니다.


기존의 Merge 방식은?

각 서브 브랜치의 작업 내용을 main 브랜치에 병합시에, Git 에서 제공하는 가장 간단한 방식으로 Merge 가 있었습니다. 병합시에는 새로운 Merge 커밋이 생성되는 모습을 확인할 수 있을겁니다.

Merge 에 대한 이론을 잘 모르신다면, 지난번 제 포스팅 링크를 참고하셔도 좋습니다.

https://velog.io/@msung99/%EB%B8%8C%EB%A0%8C%EC%B9%98Branch%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-Merge-%EA%B3%BC-Conflic

위 예시의 경우, my_branch 브랜치에서 커밋 A, B, C 를 생성하고 main 브랜치에 병합하는 상황입니다. 명령어로 표현하면 아래와 같을 것입니다.

git checkout main
git merge my_branch

Squash

여러번 커밋한 이력을 하나의 커밋 이력으로 합친후 Merge 하는데 사용합니다.

my_branch 브랜치에서 생성한 각 커밋 A, B, C 를 합쳐서 하나의 새로운 커밋을 생성하고 브랜치에 추가하는 명령이 바로 Squash 입니다.

이때 Squash 를 통해 새롭게 생성된 통합 커밋(커밋 A+B+C) 은 부모 커밋을 하나만 가지게 됩니다. 즉, Init 이라는 커밋이 있을때 통합 커밋은 Init 가 직전 커밋(부모 커밋) 이 되는 것이죠.

Squash 를 통해 통합커밋을 생성하는 명령은 아래와 같습니다.

git checkout main               // main 브랜치로 이동해서
git merge --squash my-branch    // my-branch 브랜치에 대한 통합 커밋을 생성하고
                                   main 브랜치에 병합하기 위한 명령
git commit -m "commit message"  // 통합 커밋을 생성

정리해보면, Squash 의 사용목적은 서브 브랜치의 여러 커밋들을 하나로 합쳐서 깔끔하기 만들기 위해 사용한다고 할 수 있겠습니다.


Squash VS Rebase

rebase 를 아직 잘 모르시면 아래의 제 이전 포스팅 링크를 참고하세요!

https://velog.io/@msung99/Git-Rebase%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

그렇다면 Squash 와 Rebase 의 차이에 대해서도 살펴보죠. 정리를 먼저 하자면 아래와 같습니다.

  • Squash : 서브 브랜치를 master 브랜치에 병합시, 서브 브랜치의 커밋들에 대한 통합커밋 하나를 생성하고 병합시키는 방식

  • Rebase : Squash 처럼 따로 통합커밋을 하나 생성하고 master 브랜치에다 병합하는 방식이 아닌, 서브 브랜치의 여러 커밋의 뭉탱이를 뒤에 이어서 붙여주는 방식

쉽게말해 Squash 는 통합커밋 딱 하나를 master 브랜치 뒤에 붙여주는 방식이고, Rebase 는 서브브랜치의 여러 커밋들을 뒤에 붙여주는 방식이다.

예시를 보면 더 이해가 잘 될겁니다. 아래의 방식은 서브 브랜치(my-feature) 를 Squash 해서 통합 커밋 ab 를 생성하고, 이 통합커밋을 develop 브랜치에서 merge 하는 방식입니다.

명령어로 표현하면 아래와 같습니다. (위에서 봤던 명령어랑 동일!)

$ git checkout develop
$ git merge --squash sub_branch
$ git commit -m "your-commit-message"

반면 아래는 rebase 방식입니다. 통합커밋 하나를 생성하는 것이 아닌, 서브 브랜치의 커밋 히스토리를 몽땅 다 가져와서 develop 브랜치에다 merge 하는 방식입니다.

명령어로 표현하면 아래와 같습니다.

$ git checkout sub_branch
$ git rebase develop
$ git checkout develop
$ git merge sub_branch

서브 브랜치는 rebase 를 진행해서 기존의 develop 브랜치에 커밋들이 이어서 추가가 되었습니다.


Squash 와 Rebase 를 적극 활용해보자

만일 Merge 만 사용한다면 아래와 같은 복잡한 커밋 히스토리 구조가 나올 수 있으나,

Squash 와 Rebase 를 잘만 사용한다면 아래처럼 커밋 히스토리가 단순한 구조로 예쁘게 변경되는 것을 볼 수 있을것입니다.


Merge 전략들을 비교

지금껏 브랜치를 병합하기 위한 3가지 Merge 전략(3-Way-Merge) 에 대해 살펴봤습니다. 각 전략에 대한 특징을 정리해보자면 아래와 같습니다.

팀이 실력이 아직 부족하다 느끼면, 이제 막 git으로 버전관리하는 법을 배우기 시작했다면 Squash and Merge가 좋을 겁니다.


참고 & 출처

https://cjw-awdsd.tistory.com/49

https://datalibrary.tistory.com/194

https://velog.io/@kmg2933/Git-Merge-Squash-Rebase-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

https://inmoonlight.github.io/2021/07/11/Git-merge-strategy/