Image
CI\CD/Git

[Git] git rebase 사용해 git commit history 다시 작성하기. 언제 git merge 또는 git rebase를 사용해야 하는가?

Git Merge와 Git Rebase의 차이

git merge와 rebase는 모두 두 브랜치를 합치기 위한 명령어이다. 우리는 이곳에서 이 두 브랜치를 기준 브랜치와 대상 브랜치로 나눈다. 기준 브랜치는 master과 같이 기준이 되는 브랜치이고, 대상 브랜치는 feature 브랜치들과 같이 master에 합쳐져야 하는 브랜치이다.

 

git merge와 git rebase가 다른 점은 두 브랜치의 커밋들을 합치기 위해 어떤 전략을 취하는지이다. 만약 기준 브랜치를 대상 브랜치에 merge한다고 하면(feature 브랜치에 master 브랜치를 merge), git merge는 기본적으로 merge를 하기 위해 대상 브랜치를 그대로 두고 기준 브랜치의 변경 사항(커밋)을 대상 브랜치에 얹으면서 합친다. 얹으면서 conflict이 일어나면 일어난  conflict를 수정한 커밋 또한 대상 브랜치에 얹어진다. 때문에 merge는 merge가 일어난 시간에 대상 브랜치에 새로운 커밋을 생성한다. git rebase는 git merge와 반대이다. 기준 브랜치를 대상 브랜치에 rebase한다고 하면, 무조건 기준 브랜치의 커밋 순서는 바뀌지 않고 대상 브랜치의 커밋을 기준 브랜치에 얹는 식으로 진행한다. 

 

예를 들어 다음과 같이 기준 브랜치와 대상 브랜치 사이에 분기가 일어났다고 해보자.

 

그림1. 기준 브랜치와 대상 브랜치

 

만약 git merge를 하게 되면 [그림2]와 같이 기준 브랜치의 변경사항(커밋)을 합치는 식으로 머지가 일어나게 된다. 즉, 기준 브랜치의 second commit이 대상 브랜치의 second commit으로 온다. 수행하던 중 conflict이 일어난 경우 해당 conflict이 해결된 버전이 대상 브랜치의 새로운 커밋이 된다.

 

 

그림2. git merge

 

 

그러면 git rebase를 하게 되면 어떻게 될까? git rebase는 기준 브랜치의 변경사항을 기준으로 대상 브랜치의 history 자체를 새로 쓴다. 따라서 기준 브랜치의 first commit과 second commit이 일어나고 그 다음에 new commit이 생겨난다. new commit이 생성될 때 conflict이 일어나면 수정되어야 한다.

 

그림3. git rebase

 

git merge의 단점과 git rebase의 장점

 git merge 와 git rebase 를 하는 이유는 대상 브랜치를 다시 기준 브랜치에 합치기 위함이다. git merge와 rebase 두 전략은 모두 훌륭한 전략이지만 git merge을 하는 경우는 master 브랜치에 합칠 때 새로운 커밋들이 히스토리가 남게된다. 즉, 커밋들이 뒤죽박죽이 되고 깔끔해지지 못한다.

 

그림4. git merge를 다시 기준 브랜치에 merge 했을 때

 

반대로 git rebase를 하면 대상 브랜치의 히스토리가 기준 브랜치와 같아지므로 작업이 순서대로 commit으로 남게된다. 

 

그림5. git rebase한 대상 브랜치를 기준 브랜치에 merge했을 때

 

이렇게 보면 git rebase는 매우 좋아 보인다. 하지만 git rebase를 하지 말아야 하는 때가 있다. 언제 rebase를 하지 말아야 하는지 알아보자.

 

 

git rebase를 하지 말아야 하는 때는 언제인가?

대상 브랜치가 만약 여러 명이 공동으로 작업하는 경우라고 해보자. git rebase는 commit history 자체를 새로 쓰는 것이므로 다른 사람들은 git rebase로 인해 history가 바뀌어버린다. 그렇게 되면 엄청난 문제가 일어난다. rebase로 인해 다른 사람들이 작성하던 커밋 히스토리가 바뀌게 되면 다른 사람들이 작업하던 부분들을 새로 작업해야할 수도 있기 때문이다. 따라서 rebase는 혼자 작업하는 브랜치에서만 하도록 하자.

 

 

한 브랜치를 여러명이 수정할 때는 절대 rebase를 하면 안된다.

 

 

 

반응형

 

이 글의 저작권은 '조세영의 Kotlin World' 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com