[GIT] Rebase (base 변경)

MJ·2022년 8월 16일
0

GIT

목록 보기
28/33
post-thumbnail

조상을 변경

통상적으로 조상과 후손의 유대는 바뀌지 않습니다. GIT에서는 자신의 조상을 선택할 수 있는
패륜적인 기능을 가지고 있습니다.

자신의 base를 변경하는 강력한 기능을 가진 rebase 명령어에 대해서 알아보겠습니다.


🍉 Rebase

  • branchbase(부모or조상)을 변경하는 명령어
  • 자신의 저장소에 base가 되는 커밋을, 다른 branch로 변경한다는 의미 입니다.
git rebase [rebase할 브랜치명]
# 현재 브랜치의 버전이 rebase할 브랜치의 최신버전 이후로 이동 됩니다.

git rebase topic 
# 현재 브랜치의 base를 topic 브랜치로 변경하겠다라는 의미

Rebase는 로컬저장소에서만 사용

❗ 원격저장소에 Push 하기 전까지만 사용

rebase 하기 이전의 브랜치의 커밋 버전과, rebase 한 이후에 브랜치의 커밋 버전에
wokring directory가 다르기 때문에, push한 이후에 rebase 하면 충돌이 발생합니다.

Rebase 충돌 해결?

❗ rebase를 사용 할 때 중요한 점은 서로 다른 브랜치간에 공통된 파일 혹은 수정내역이 없어야 충돌이 발생하지 않습니다.

a branch에 work.txt 파일이 있고, rebase할 b branch에 똑같은 파일이 있다면
a branch의 base를 재작성할 때 같은 파일로 인해 충돌이 발생합니다.

✔️ 충돌을 해결하는 방식은 3 way merge를 사용합니다.
✔️ 3 way merge 병합 방식에 base가 되는 commit은 base를 바꾸려는 브랜치 버전(HEAD)에 이전 버전이 됩니다.



❗ Rebase 사용 하기

1. 실습 환경 구성
이전 포스팅 cherry_pick에서 사용한 환경과 동일 합니다.


2. main branchbasetopic branch로 변경할 것 입니다.
2.1 이제 main branchtopic branch의 커밋 이후 버전에 작업한 것으로 보이게 됩니다.
2.2 새로운 커밋으로 생성된 m1, m2는 rebase 하기 전에 m1, m2와는 다릅니다


번외. 결과적으로 main branchbasetopic branch으로 변경되었습니다.

base가 변경 되면서, main branch는 이제 더이상 init commit을 조상으로 두지 않고
자신이 커밋한 m1, m2의 버전 또한 topic branch이후에 작업한 버전처럼 변경 되었습니다.


궁극적으로는 base가 단순하게 변경되는 것이 아니라, 이전에 작업한 모든 커밋을
새로운 base와 병합을 해서 새로운 커밋 버전이 생성되는 것
입니다.

그렇기 때문에 rebase의 저장소와 기존의 저장소에 동일한 파일이 있다면 충돌하게 됩니다.



💊 Rebase 충돌 해결

현재 브랜치와 Rebase할 브랜치에 똑같은 파일의 내용이 있다면, 이 부분은 rebase할 때 충돌이
발생하게 됩니다. 충돌이 발생하면 어떻게 해결 하는지 알아보겠습니다.


1. 실습 환경 재구성


2. main branch의 base를 topic branch로 rebase
2.1 main branch의 m2 버전과 topic branch의 t4 버전을 병합하면서 충돌 발생


3. rebase를 진행하면서 생긴 충돌을 mergetool로 해결하기
3.1 main branch와 topic branch를 rebase 할 때, base가 되는 부분은 main branch의
m2 commit 입니다.


4. m2 버전과 t4버전의 충돌이 해결되면서 새로운 m2 버전의 커밋으로 병합 됨
4.1 새로운 m2 버전과 아직 병합하지 못한 m3 버전을 병합하는 과정중에 충돌이 발생
4.2 추가로, 오류난 정보를 갖고있는 .orig 파일은 rm 으로 삭제하시길 바랍니다.


5. m2 버전과 m3 버전의 충돌 해결
5.1 툴을 실행하기 위해 git mergetool 사용


6. 충돌 해결 후 불필요한 .orig 파일 삭제, git 내역을 조회해서 rebase가 됬는지 확인

profile
프론트엔드 개발자가 되기 위한 학습 과정을 정리하는 블로그

0개의 댓글