통상적으로 조상과 후손의 유대는 바뀌지 않습니다. GIT
에서는 자신의 조상을 선택할 수 있는
패륜적인 기능을 가지고 있습니다.
자신의 base
를 변경하는 강력한 기능을 가진 rebase
명령어에 대해서 알아보겠습니다.
branch
의 base(부모or조상)을 변경하는 명령어branch
로 변경한다는 의미 입니다.git rebase [rebase할 브랜치명]
# 현재 브랜치의 버전이 rebase할 브랜치의 최신버전 이후로 이동 됩니다.
git rebase topic
# 현재 브랜치의 base를 topic 브랜치로 변경하겠다라는 의미
❗ 원격저장소에 Push 하기 전까지만 사용
rebase 하기 이전의 브랜치의 커밋 버전과, rebase 한 이후에 브랜치의 커밋 버전에
wokring directory가 다르기 때문에, push한 이후에 rebase 하면 충돌이 발생합니다.
❗ rebase를 사용 할 때 중요한 점은 서로 다른 브랜치간에 공통된 파일 혹은 수정내역이 없어야 충돌이 발생하지 않습니다.
a branch에 work.txt 파일이 있고, rebase할 b branch에 똑같은 파일이 있다면
a branch의 base를 재작성할 때 같은 파일로 인해 충돌이 발생합니다.
✔️ 충돌을 해결하는 방식은 3 way merge를 사용합니다.
✔️ 3 way merge 병합 방식에 base가 되는 commit은 base를 바꾸려는 브랜치 버전(HEAD)에 이전 버전이 됩니다.
1. 실습 환경 구성
이전 포스팅 cherry_pick에서 사용한 환경과 동일 합니다.
2. main branch
에 base를 topic branch
로 변경할 것 입니다.
2.1 이제 main branch
는 topic branch
의 커밋 이후 버전에 작업한 것으로 보이게 됩니다.
2.2 새로운 커밋으로 생성된 m1, m2는 rebase 하기 전에 m1, m2와는 다릅니다
번외. 결과적으로 main branch
의 base가 topic branch
으로 변경되었습니다.
base가 변경 되면서, main branch
는 이제 더이상 init commit을 조상으로 두지 않고
자신이 커밋한 m1, m2의 버전 또한 topic branch
이후에 작업한 버전처럼 변경 되었습니다.
궁극적으로는 base가 단순하게 변경되는 것이 아니라, 이전에 작업한 모든 커밋을
새로운 base와 병합을 해서 새로운 커밋 버전이 생성되는 것 입니다.
그렇기 때문에 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가 됬는지 확인