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

[Git_34] 리베이스(rebase) - 무작정 따라하기

by 위시랜 2023. 1. 17.

리베이스(rebase) - 무작정 따라하기
리베이스(rebase) - 무작정 따라하기

리베이스(rebase)

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

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

 

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

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

 

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

 

무작정 따라 해 보기

일단 무작정 리베이스를 한번 해보도록 하겠습니다.

다시 실습을 위해 master와 hotfix 브랜치를

commit 5 지점으로 되돌려서 다음의 상태로 만들었습니다.

master, hotfix 브랜치에서 커밋 5회 한 커밋 이력
master, hotfix 브랜치에서 커밋 5회 한 커밋 이력

 

현재 상태를 그림으로 나타내면 다음과 같습니다.

master, hotfix 브랜치에서 커밋 5회 한 커밋 이력 도식화
master, hotfix 브랜치에서 커밋 5회 한 커밋 이력 도식화

여기서 hotfix 브랜치에서 filea.html 파일을 수정해 한 번 커밋하고,

master 브랜치에서 filea.html을 수정하면서 두 번 커밋을 진행합니다.

 

그 결과 다음과 같은 상태가 되었습니다.

master 브랜치에서 두 번 커밋, hotfix 브랜치에서 한 번 커밋한 결과
master 브랜치에서 두 번 커밋, hotfix 브랜치에서 한 번 커밋한 결과

 

각 커밋 시점의 filea.html 파일 내용은 다음과 같습니다.

각 브랜치 별 filea.html 파일 변경 이력 및 내용
각 브랜치 별 filea.html 파일 변경 이력 및 내용

 

현재까지 상태를 그림으로 나타내면 다음과 같습니다.

현재까지 커밋 이력을 도식화
현재까지 커밋 이력을 도식화

 

여기서 리베이스(rebase)를 이용해 두 브랜치를 합쳐보겠습니다.

그 실행 화면은 다음과 같습니다.

리베이스(rebase) 실행 화면
리베이스(rebase) 실행 화면

 

성공적으로 리베이스 되었다는 메시지를 확인할 수 있습니다.

 

여기서 주목할 점은 병합(merge) 할 때와 다른 점은

master에서 실행한 게 아니라

hotfix 브랜치에서 실행했다는 점입니다.

 

이 부분은 다시 얘기하겠습니다.

 

그리고, filea.html 파일 내용을 확인해 보니

master의 수정 정보와 잘 합쳐졌음을 알 수 있습니다.

 

다음과 같습니다.

# <브랜치 이름>의 HEAD 커밋으로 리베이스 하기
$ git rebase <브랜치 이름>

리베이스(rebase) 실행에 따른 filea.html 파일의 변화
리베이스(rebase) 실행에 따른 filea.html 파일의 변화

 

소스트리에서도 커밋 이력을 확인해 보면

다음과 같이 실행 후 변경되었음을 알 수 있습니다.

소스트리(Sourcetree)에서 리베이스 전/후의 커밋 이력 확인
소스트리(Sourcetree)에서 리베이스 전/후의 커밋 이력 확인

 

지금의 결과를 그림으로 나타내면 다음과 같습니다.

리베이스(rebase) 이후 커밋 이력 도식화
리베이스(rebase) 이후 커밋 이력 도식화

hotfix의 HEAD 커밋의 내용을 가지고,

master의 HEAD 커밋 다음으로 “Rebase 커밋”을 생성합니다.

 

새로운 커밋을 생성하는 것이므로

hotfix의 HEAD 커밋의 내용이 master의 HEAD 커밋의 내용과

병합이 되어 “Rebase 커밋”이 생성됩니다.

 

master에 새로운 커밋(Rebase 커밋-200121b)이 생성되고

hotfix 브랜치의 커밋 HEAD는 “Rebase 커밋”으로 변경되었습니다.

 

그런데, master 가 가리키는 커밋 아이디는 변경이 없음을 알 수 있습니다.

이와 같이 리베이스(rebase)는

현재 작업 브랜치의 커밋만 변경하고,

master 브랜치의 HEAD 포인터는 변경하지 않음을 알 수 있습니다.

 

따라서 리베이스 한 후에는 HEAD를 맞춰줘야 합니다.

그러기 위해서는 master에서 merge 명령어를 이용해

다시 hotfix와 병합해야 합니다.

 

master로 체크아웃한 후, hotfix와 병합합니다.

그 실행 화면은 다음과 같습니다.

master 브랜치에서 hotfix 브랜치와 병합(merge) 실행 화면
master 브랜치에서 hotfix 브랜치와 병합(merge) 실행 화면

 

병합이 성공적으로 완료되었음을,

그리고 병합에 사용된 방식은 Fast-forward임을 알 수 있습니다.

 

그 결과를 소스트리에서도 확인하면 다음과 같습니다

소스트리(Sourcetree)에서 커밋 이력 최종 확인
소스트리(Sourcetree)에서 커밋 이력 최종 확인

 

이상과 같이 리베이스(rebase)가 동작하는 것을

실제 실습을 통해 확인해 봤습니다.

조금 감이 올 거라 생각되는데요.

 

다음 시간에 리베이스(rebase)에 대해

다시 정리하고 이해할 수 있도록 하겠습니다.

 

감사합니다.

댓글