rebase는 말 그대로 (re-base)로 베이스를 재배치한다는 뜻
입니다.
merge
는 사용하면 히스토리를 볼 때 커밋 내역이 여러개로 갈라져 히스토리를 확인하고 추적하기에 어려움이 있습니다.
하지만, rebase
는 베이스를 다시 정의한다는 의미에 따라서 새롭게 커밋 내역을 정리하여 히스토리 기록을 깔끔~~~하게 볼 수 있게 해줘요.
Merge 브랜치에서 사용하는 전략은 각 브랜치의 마지막 커밋 두 개와 공통 조상의 총 3개의 커밋을 이용하는 3-way merge를 수행하여 새로운 커밋을 만들어내는 것
입니다.
두 브랜치를 합치는 Rebase
는 Merge와는 다르게 이름 그대로 브랜치의 공통 조상이 되는 base를 다른 브랜치의 커밋 지점으로 바꾸는 것입니다. 두 브랜치의 그림을 다시 보겠습니다.
rebase전 로컬 master 브랜치를 업데이트하기 위해 체크아웃을 합니다.
git checkout master
git pull origin master
다시 기존 작업하던 branch로 돌아갑니다.
git status # 작업 커밋이 완료 되었는지 확인
git checkout <branch>
rebase는 push 전 단계에서 진행됨으로 commit까진 필요!!
2가지 방법이 보편적이에요. HEAD
포인터를 이용하는 방법과 master(or main) branch로 접근하여 진행하는 방식
HEAD
포인터를 이용하는 방법git rebase -i HEAD~3
최근 커밋한 내역 3개를 rebase한다는 의미가 됩니다.
가장 오래된 커밋 내역만 pick 상태로 두고 나머지는 s(or squash)를 입력
합니다.
이후 저장하고 다음 단계로 넘어갑니다.
이후 squash 커밋 메시지를 입력
하게 됩니다.
다시 커밋 내역을 확인해 보면 이전과 다르게 커밋메시지는 한개만 확인되어야 합니다.
만약 conflict
가 발생하게 되면 git에서 뱉어내는 오류에 따라 차분히 컨플릿 해결을 진행하면 됩니다.
이후 github master(or main)브랜치에 push
를 날려 pull request를 요청하면 됩니다.
git rebase -i master(or main) <other feature branch>
master와 마스터에 병합할 브랜치
를 인자로 작성하여 명령어를 날립니다.
상기에 언급 한 것처럼 가장 오래된 커밋 내역만 pick하고 나머지는 s상태로 바꾸고 저장하고 나옵니다.
번외 rebase 충돌 해결
1. 충돌이 일어난 경우 Rebase가 진행되지도, 끝나지도 않고 도중에 멈춰 있는 경우가 발생합니다.
2. 터미널이 (rebase ~ 1/6) 과 같은 메세지로 rebase가 진행중임을
알려주므로 주의깊게 로그 기록을 확인합니다.
3. 충돌은 충돌일 뿐이므로 충돌된 코드를 다시 확인하여 해결해줍니다.
4. Git add . 명령어 실행
5. Git commit은 하지 않습니다 수정 사항이 없기 때문이조.
6. Git rebase ㅡㅡcontinue
를 진행한다
7. 멈춰 있던 리베이스가 진행됩니다.
8. 충돌이 여러번 나면 그 때마다 충돌을 해결하고
git add . / git rebase ㅡㅡcontinue
를 반복합니다.
9. 계속 해결이 안된다면, git rebase ㅡㅡabort
로 아예 rebase를
진행하기 전 상황으로 돌아갈 수도 있습니다.