[Git] Merge vs Rebase

Merge와 Rebase에 관해 헷갈리는 부분이 생겨서 이번 기회에 정리하고자 한다.

 

merge는 현재 브랜치에 내가 원하는 브랜치의 내용을 가져오는 것이다.

git checkout feature

git merge main

feature브랜치main브랜치의 커밋내용을 가져온다. 

 

 

rebase는 base를 바꾼다. 

base란?

자신이 파생된 브랜치(조상 브랜치)와 공통으로 가지고 있는 커밋이 base다.

 

git checkout feature

git rebase main

feature 브랜치의 base를 main 브랜치의 최신 커밋으로 바꾸겠다.


원격 저장소에서 프로젝트를 가져올 때

git fetch + git merge ⇒ git pull

git fetch + git rebase

2가지 방법이 있다.

 

그러면 merge와 rebase의 차이는 무엇일까?

위의 이미지는 main 브랜치에서 git merge dev와 git rebase dev했을 때의 상황을 보여준다.

 

merge - 두 브랜치를 병합한다. (병합 시 Merge 커밋을 남김)

  • fast forward merge의 경우에 —no-ff 옵션 사용하면 새로운 커밋을 생성하면서 merge한다.
  • 배포용 버전 브랜치에서 merge할 때는 —no-ff를 권장한다.

rebase - 베이스를 재정의하여 커밋 히스토리를 조작한다. (단, 이 때 기존 커밋들을 갖다놓는게 아닌 복사 후 붙여넣기 방식으로 이어가기에 커밋 해시값이 다르다. 커밋 내용만 같을 뿐 해시 값을 기준으로 보면 다른 커밋으로 인식한다.)

그러면 왜 2가지의 방법을 제시하는 것일까?

Merge의 경우 브랜치와 커밋이 많으면 Merge할때마다 브랜치와 merge 커밋을 남기기에 깃 히스토리가 복잡해져서 알아보기 쉽지 않아진다.

반면 Rebase는 하나의 브랜치로 깃 커밋 히스토리를 가져가기에 깃 히스토리가 단순해진다.

크게 보면 두 명령어 다 2개의 브랜치를 하나로 합치는 것이지만, 그 구조는 자세히 보면 완전히 다른 걸 알 수 있다. 그렇기에 어떤 경우에 merge 혹은 rebase를 쓸지는 팀원 간의 협업 과정에 정해서 결정하는 것이 중요하다!. (해당 브랜치를 남겨놓을지 등등…)

Rebase 사용할 때 주의할 점!

앞서 rebase는 기존 커밋들을 복사해서 붙어넣기에 커밋의 해시값이 바뀐다고 했다.

그렇기에 원격 저장소에 저장된 커밋을 rebase할 경우 같은 커밋이지만 해시값이 달라서 push하면 원격저장소에 중복된 커밋이 존재하게 된다.

그렇기에 원격 저장소에 올라간 커밋을 rebase를 하는 일이 없도록 주의하자!