brunch

매거진 Git과 Github

You can make anything
by writing

C.S.Lewis

by anonymDev Mar 02. 2019

4. Merge 와 Rebase의 차이점

Merge 와 Rebase에 대한 개인적 견해

Merge vs Rebase


두개의 차이점을 간단하게 그림으로 설명해보자.


아래 설명은 "그냥 그런가보다."하고 일단 받아들이고 직접 사용해보면서 깨닫는걸 추천한다.


우선 병합을 하기 전 commit tree를 보자.


병합전 commit tree

bts-image 브랜치는 master에서 분기 후에 2개의 commit을 했다. master에서도 bts-image가 분기한 후에 메인페이지에 본문글을 추가한 커밋이 추가됐다.


master에서
$git merge $git rebase로 두 브랜치를 병합했을 때
commit tree가 어떻게 달라지는지 보자.

$git merge


master에서 $git merge를 실행하게 되면 bts-image 브랜치를 병합하는 커밋로그가 master에 Head로 새로 추가된다.



$git rebase


master에서 $git rebase를 실행하면  bts-image 브랜치를 베이스(Base)로 커밋을 재정렬 한다.


(중요) 비교를 위해서 설명했지만 master에서 rebase를 하는건 피하자. master는 함부로 건드리지 않기로 약속했던걸 기억하자. rebase를 하게 되면 커밋도 새로 쓰고 정렬도 새로하기때문에 기존의 커밋트리가 완전히 달라진다.

같은 커밋 메시지여도 rebase전의 커밋로그와 후의 커밋로그의 해쉬 값이 달라진걸 확인해보자.

bts-image의 브랜치의 커밋로그가 master커밋 트리 중간에 불쑥 들어온 걸 확인해보자.

즉 리베이스 전에 master에서 분기했던 브랜치를 (커밋트리가 달라진) master에 병합할 경우 무수히 많은 충돌을 직면하게 될수 있다.


 branch-1: master야 너 예전에 내가 알던 네가 아니다?
master: 어 방탄소년단(bts-image브랜치)을 만나고 나는 새롭게 태어났거든.

이런 느낌이다.


하지만 충분히 쓸모있는 명령어이다. master 대신에 bts-image에서 병합하기 전에 master를 리베이스 하자.

rebase전 commit tree
rebase 후 커밋트리

master를 기준으로 bts-image브랜치를 재정렬했기 때문에 master와의 충돌 걱정을 할 일이 없다. 즉, feat fast-forward merge가 가능해진다.




마무리


커밋로그를 어떻게 관리하고 Git을 어떻게 사용하는가에 맞춰서 목적에 맞게 사용하기 바란다.

현재 속한 팀에서는 Master에 작업 내용을 병합할 때 Squash merge를 사용한다. 따라서 $git merge를 사용만으로도 커밋로그를 깨끗이 관리할 수 있어서 rebase를 잘 사용 안했다.

"본인이 작성한 모든 커밋 하나하나가 master에 정리돼서 들어가야 한다."라면 $git rebase는 필수다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari