티스토리 뷰

Tools/Git

[Git] rebase

SdardewValley 2022. 6. 5. 14:00
반응형

rebase

  rebase도 merge와 마찬가지로 브랜치를 합치는 방법 중 한가지이다.  rebase가 merge와 달리 commit들을 재배열한다.

 

 

base

분기가 발생한 main commit 1이 base commit이다

  새로운 브랜치는 기존의 브랜치를 기반으로 생성된다. 그리고 이렇게 새로운 브랜치가 생성됐을 때 분기가 발생했다고 표현한다. 위의 그림에서 feature 브랜치는 main 브랜치 기반으로 생성된다. 분기가 발생한 공통 조상 commit, main commit 1을 base라고 한다.

  rebase는 이 base 앞에 re가 붙은 단어이다. rebase는 브랜치 분기가 발생한 기준이 되는 브랜치의 base commit을 변경하는 것이다.

 

 

rebase를 하는 이유

  rebase를 하면 commit의 트리 구조가 단순화된다. 브랜치의 개수가 많아지는 경우 commit을 관리하기 쉽지 않다. 이런 경우 rebase를 사용해서 분기가 발생한 base commit을 변경하여 여러 개의 가지가 아닌 하나의 가지로 보이도록 하는 것이다. 하나의 가지이기 때문에 구조가 단순화되고 진행상황 파악이 쉬워진다.

 

base가 main commit 1에서 main commit 3로 변경되었다

 

 

rebase vs merge

작업 상황

  commit 1에서 분기가 일어나서 기존 브랜치에서는 commit 4, commit 5의 작업을 파생된 브랜치에서는 commit 2, commit 3 작업을 진행한 상황이고 다른 부분을 수정했다고 하자.

 

merge를 사용한 병합

  merge를 사용해서 병합을 하면 3-way 방식으로 두 브랜치를 비교하면서 병합을 하고 병합을 위한 commit(그림에서는 commit 6)가 생성된다.

 

rebase를 사용한 병합

  rebase는 두 브랜치를 비교하지 않고 순차적으로 commit 병합을 한다. 기존의 브랜치의 마지막 commit(여기서는 commit 5)으로 base를 변경한다. 그리고 파생된 브랜치의 diff를 반영한다. rebase에서는 병합 commit이 없다.

 

 

실습

  merge 명령어는 파생된 브랜치의 원본 브랜치에서 실행한다. rebase는 merge 명령어와는 반대로 원본 브랜치가 아닌 파생된 브랜치에서 실행한다.

  원본 브랜치가 main, 파생된 브랜치가 feature라고 하면 merge는 main 브랜치에서 git merge feature를 실행할 것이고, rebase는 feature 브랜치에서 git rebase main을 실행할 것이다.

 

main 브랜치의 log
feature 브랜치의 log

  분기 이후로 발생한 main 브랜치와 feature 브랜치의 commit log이다. 

 

rebase 실행

  feature 브랜치에서 git rebase main을 실행했다.

 

feature 브랜치 log

  feature은 main 브랜치의 마지막 commit 이후에 추가되었다. main 브랜치의 commit id는 변경이 되지 않았지만, feature 브랜치의 commit id는 변경(8876~ → 8cb53)이 되었다. base가 변경되는 과정에서 commit들의 위치를 변경하는 과정에서 id값 중복을 방지하기 위해 commit들의 id가 변경된다.

  로그를 보면 main 브랜치의 포인터 여전히 main 브랜치의 마지막 commit을 가리키고 있다. rebase는 commit을 위치를 변경할 뿐 포인터를 이동시키지는 않는다. 따라서 rebase 이후에는 브랜치를 변경해야 한다.

 

main, feature 병합

  main 브랜치에서 feature 브랜치를 merge를 사용하여 병합하였다. rebase 이후에는 Fast-Forward 방식으로 병합이 되었다. 브랜치 위에서 설명한 그림을 보면 파생된 브랜치에서만 commit이 발생했을 때와 같은 트리 모양이기 때문에 Feat-Forward 방식으로 병합되었다.

 

포인터 위치 변경
git log --graph --all --oneline

  main 브랜치의 포인터도 변경된 것을 확인할 수 있다. commit들이 트리 구조가 아닌 선형 구조로 변경된 것을 확인할 수 있다. setting에서 그래프의 분기가 발생했지만 분기가 발생하지 않은 것처럼 그래프가 출력된다.

 

 

conflict

  merge와 마찬가지로 rebase도 동일한 부분을 수정하면 충돌이 발생한다.

 

rebase 충돌
충돌 부분 표시

  rebase에서 충돌이 발생하면 merge와 마찬가지로 충돌한 부분이 표시된다. 충돌이 발생한 경우 메시지로 충돌을 해결한 뒤에 git rebase --continue를 실행하라고 안내해준다.

 

충돌 수정

  수정을 한 뒤 다시 git add를 하고 git rebase --continue 명령어를 통하여 다시 rebase를 진행한다.

 

git log

  git log를 통해서 확인하면 rebase가 성공한 것을 확인할 수 있다. rebase가 완료된 후에도 마찬가지로 git merge를 통해서 병합을 해주어야 한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함