git rebase와 merge 차이점 rebase 할 때, 주의 사항

반응형

git rebase 란?

git에서 한 브랜치와 다른 브랜치를 합치는 방법이 merge와 rebase가 있습니다.

 

git rebase는 한 브랜치의 베이스 브랜치를 다시 설정하는 기능입니다.

예시를 보면서 한번 알아보도록 하겠습니다.

 

merge 했을 때,

아래와 같이 main 브랜치에서 commit2를 작업을 하고

다른 브랜치에서 작업을 하게 되면 main 브랜치와 다른 브랜치의 베이스 브랜치가 달라지게 됩니다.

 

베이스 브랜치가 달라진 상태에서 merge를 하게 되면

아래와 같이 새로운 merge commit이 새롭게 생성되고 브랜치가 merge 됩니다.

 

작업하는 브랜치가 많지 않다면 크게 문제는 없지만,

여러 브랜치를 Merge를 하게 된다면 작업 히스토리가 어떻게 되는지 파악하기 어려울 수도 있습니다.

 

rebase를 사용했을 때

main 브랜치에서는 commit 4를 작업하였고, 다른 브랜치에서는 commit 5를 작업하였습니다.

다른 브랜치에서 git rebase main를 이용해서

main 브랜치의 베이스와 다른 브랜치의 베이스를 동일하게 변경할 수 있습니다.

 

추가적인 merge를 위한 커밋 없이 깔끔하게 히스토리를 정리할 수 있는 장점이 있습니다.

 

git rebase 주의 사항

이미 공개 저장소에 Push 한 커밋을 Rebase 하지 마라

이미 원격 저장소에 커밋을 한 커밋은 해시값이 있습니다.

해시값이 있는 커밋을 다시 Rebase 하게 되면 새로운 해시값으로 새로운 커밋이 만들어지게 됩니다.

이럴 경우 동일한 커밋 메시지가 2개가 히스토리에 남게 되면 혼란을 초래할 수 있습니다.

 

  1. main 브랜치에서 superman, batman, pororo 가 브랜치를 만들어서 작업을 진행함.
  2. superman이 작업 완료 이후 main 브랜치에 작업을 merge 함
  3. batman 작업 중 main 브랜치를 rebase를 하여 superman의 작업을 가지고 옴
  4. batman이 pororo 브랜치를 rebase 함 (문제 발생)

이미 공개 저장소에 Push 한 커밋을 다른 브랜치로 Rebase를 하게 되면 문제가 생길 수 있습니다.

아래와 같이 동일한 작업인 superman commit이 두 개의 히스토리가 남게 됩니다.

 

동일한 작업인 superman commit이 두개의 히스토리가 남게 됩니다.

728x90
반응형