다양한 merge - 여러가지 2 (rebase, squash)

woolee의 기록보관소·2022년 11월 2일
0

개발환경

목록 보기
9/17

rebase

Git에서 한 브랜치에서 다른 브랜치로 합치는 방법으로는 두 가지가 있다. 하나는 Merge 이고 다른 하나는 Rebase 다.

정확하게, rebase는 브랜치의 시작점을 다른 브랜치의 commit으로 옮겨주는 걸 말한다.

rebase를 이용해서 신규 브랜치의 시작점을 main 브랜치의 최근 commit으로 옮길 수 있다.

git switch <새로운 브랜치명>
git rebase main

위 코드처럼, 새로운 브랜치로 switch를 한 뒤, rebase main을 한다.

git switch main
git merge 새로운 브랜치 

그리고 위 코드처럼, 다시 main으로 switch한 뒤, merge를 하면 fast-forward merge가 된다.

merge는 주어진 상황에 따라서 3-way merge를 하거나(둘 다 커밋사항 있거나), fast-forward merge(하나만 커밋사항 있거나)를 자동으로 한다.

근데 여기서 새로운 브랜치에서 rebase를 하면 커밋사항이 사실상 하나만 존재하는 걸로 되므로 main으로 돌아가서 merge를 하면 자동으로 fast-forward merge가 된다.

rebase를 하는 이유는,
3-way merge 말고 강제로 fast-forward merge를 할 때 쓴다. (왜냐하면 보통 브랜치가 여러 개일 때 3-way merge 하면 대참사가 발생할 수 있기 때문이다.)

물론 rebase의 단점이 있다. conflict 자주 발생한다. 이미 공개 저장소에 push한 커밋을 rebase하면 문제가 생긴다!!!

squash

rebase과 달리, squash는 새로운 브랜치에서 생성한 커밋들을 전부 모아서 기준 브랜치에서의 새로운 커밋으로 만들어준다.

아래 그림에서 보듯, 일반적인 3-way merge는 선으로 새로운 브랜치에서 기준 브랜치로 선을 이어준다. 반면 squashed merge는 선을 긋는 게 아니라 커밋한 내용들을 기준 브랜치로 순간 이동을 한다.

squash merge는 선으로 이어주는 게 아니므로 git log 출력해보면 merge가 완료된 브랜치 commit들이 출력되지 않으므로 git log가 깨끗해진다.

squash merge 하는 법

git switch main
git merge --squash <다른 브랜치명>
git commit -m '커밋 메세지'

이렇게 작성하면 main으로 이동해서 다른 브랜치에서 작성한 커밋들을 합쳐서 main에서의 새로운 커밋으로 만들어 준다.

브랜치 많은데 normal merge 잔뜩 하면 git log 더러워진다.


참고

3.6 Git 브랜치 - Rebase 하기
Git Squash

profile
https://medium.com/@wooleejaan

0개의 댓글