본문 바로가기
코딩해보니/Git

[Git_35] 리베이스(rebase) - 이해하기(개념 잡기)

by 위시랜 2023. 1. 24.

리베이스(rebase) 이해하기
리베이스(rebase) 이해하기

리베이스(rebase)

Git에서 브랜치를 생성하고 병합하고,

그 과정에 충돌이 발생했을 때 해결하는 부분들을 학습했습니다.

 

우리는 브랜치를 다른 브랜치와 합칠 때 병합(merge)을 사용했었습니다.

그런데 Git에서 브랜치를 합치는 방법으로 리베이스(rebase)가 있습니다.

 

이 리베이스는 커밋의 배치를 조절해서 병합한 결과를 만들어 낸다고 할 수 있습니다.


리베이스(rebase) 이해하기

지난 시간에 리베이스(rebase)를 무작정 사용해 봤습니다.

그럼, 지금까지 실행해 본 리베이스를 되짚어 보겠습니다.

 

결과적으로 보더라도

리베이스라는 것은 베이스(base)가 되는 커밋을 재(re, 다시) 설정한다는 의미라고 이해할 수 있습니다.

리베이스(rebase) 실행 전의 커밋 이력이 다음과 같았습니다.

리베이스(rebase) 실행 전 커밋 이력
리베이스(rebase) 실행 전 커밋 이력

여기서 hotfix 브랜치의 베이스(base)가 되는 커밋은 무엇일까요?

베이스가 되는 커밋은 브랜치가 시작되는 지점을 얘기합니다.

 

따라서 hotfix 브랜치의 베이스가 되는 커밋은

커밋 아이디 94d53f0인 다섯 번째 커밋입니다.

베이스(base)가 되는 커밋
베이스(base)가 되는 커밋

 

이런 hotfix 브랜치를

rebase 명령어로 master 브랜치로 리베이스(rebase)를 실행한 것입니다.

 

그래서 리베이스를 실행할 때에는

머지(merge)와 다르게 리베이스 할 대상이 되는 브랜치에서 실행해야 합니다.

 

즉, hotfix 브랜치에서 $ git rebase master라고 하면,

현재 브랜치(hotfix)의 베이스가 되는 커밋을

master 브랜치의 HEAD 커밋 다음으로 rebase 커밋을 생성하고

해당 커밋을 베이스 커밋으로 재설정하겠다는 의미입니다.

 

재설정이라는 얘기는 재생성과 같은 얘기로 이해해야 합니다.

왜냐면 재설정이 되면 커밋 아이디(해시값)도 변경되기 때문입니다.

 

hotfix 브랜치에서 $ git rebase master 실행 결과가 다음과 같았습니다.

$ git rebase master 실행 결과
$ git rebase master 실행 결과

 

베이스가 되는 커밋을

master 브랜치의 HEAD 포인터인 커밋 아이디가 729c4d0인 일곱 번째 커밋으로 재설정됨으로써,

기존 베이스(다섯 번째 커밋) 이후로 분기된 hotfix의 커밋들이

master 브랜치의 일곱 번째 커밋을 베이스로 해서 이어지게 됩니다.

 

이렇게 되면서 기존 hotfix 브랜치의 여섯 번째 커밋 아이디가 변경됩니다.

다시 말해, master 브랜치의 HEAD 이후로

hotfix 브랜치의 커밋들을 순차적으로 다시 기록(커밋) 되는 것입니다.

 

rebase(리베이스)를 실행한 결과가 다음과 같은데,

rebase를 실행한 결과
rebase를 실행한 결과

 

이는 master 브랜치의 HEAD 커밋이 일곱 번째 커밋일 때

hotfix 브랜치를 생성하고 hotfix가 한 번 추가적으로 커밋한 결과와 같아집니다.

 

이 이후에 우리는 master 브랜치를

hotfix 브랜치와 병합(merge)을 실행함으로써

master 브랜치의 HEAD 커밋이 hotfix 브랜치와 같아지면서

여덟 번째 커밋이 hotfix 브랜치와 공통 커밋이 됩니다.

리베이스(rebase)이후 master 브랜치를 hotfix와 병합(merge)한 결과
리베이스(rebase)이후 master 브랜치를 hotfix와 병합(merge)한 결과

 

간단하게 리베이스(rebase)에 대해 알아보기 위해

hotfix 브랜치의 커밋을 하나만 해서 오히려 헷갈릴 수도 있겠다는 생각이 듭니다.


만약, 다음과 같은 경우에 $ git rebase master라고 실행한다면,

리베이스(rebase) 실행 전 커밋 이력
리베이스(rebase) 실행 전 커밋 이력

 

hotfix 브랜치의 여섯 번째 커밋부터 여덟 번째 커밋이

master 브랜치의 일곱 번째 커밋 다음으로 rebase(리베이스) 됩니다.


그림으로 나타내면 다음과 같습니다.

리베이스(rebase) 실행 결과
리베이스(rebase) 실행 결과

 

hotfix 브랜치의 베이스(base)가 되는 커밋을

master 브랜치의 HEAD 포인터인 커밋 아이디가 729c4d0 인 일곱 번째 커밋으로 재설정됨으로써,

기존 베이스(다섯 번째 커밋) 이후로 분기된 hotfix 브랜치의 커밋들이

master 브랜치의 일곱 번째 커밋을 베이스로 해서 이어지게 됩니다.


다시 말해, master 브랜치의 HEAD 이후로

hotfix 브랜치의 커밋들을 순차적으로 다시 기록(커밋) 되면서,

각 커밋들의 해시 값도 변경되게 됩니다.

 

여기까지 리베이스(rebase)가 동작하는 방식을

커밋 이력을 바탕으로 확인해 봤습니다.

조금 이해가 되려나요~

 

감사합니다.

 

 

댓글