[git] rebase정의 및 사용방법

Hyeseong·2021년 3월 23일
0

GIT

목록 보기
24/24

정의

rebase는 말 그대로 (re-base)로 베이스를 재배치한다는 뜻입니다.
merge는 사용하면 히스토리를 볼 때 커밋 내역이 여러개로 갈라져 히스토리를 확인하고 추적하기에 어려움이 있습니다.
하지만, rebase는 베이스를 다시 정의한다는 의미에 따라서 새롭게 커밋 내역을 정리하여 히스토리 기록을 깔끔~~~하게 볼 수 있게 해줘요.

Merge vs Rebase

Merge

Merge 브랜치에서 사용하는 전략은 각 브랜치의 마지막 커밋 두 개와 공통 조상의 총 3개의 커밋을 이용하는 3-way merge를 수행하여 새로운 커밋을 만들어내는 것입니다.

Rebase

두 브랜치를 합치는 Rebase는 Merge와는 다르게 이름 그대로 브랜치의 공통 조상이 되는 base를 다른 브랜치의 커밋 지점으로 바꾸는 것입니다. 두 브랜치의 그림을 다시 보겠습니다.

본론

rebase전 로컬 master 브랜치를 업데이트하기 위해 체크아웃을 합니다.

git checkout master
git pull origin master

다시 기존 작업하던 branch로 돌아갑니다.

git status # 작업 커밋이 완료 되었는지 확인
git checkout <branch>

rebase는 push 전 단계에서 진행됨으로 commit까진 필요!!

rebase

2가지 방법이 보편적이에요. HEAD포인터를 이용하는 방법과 master(or main) branch로 접근하여 진행하는 방식

1. HEAD포인터를 이용하는 방법

git rebase -i HEAD~3

최근 커밋한 내역 3개를 rebase한다는 의미가 됩니다.
가장 오래된 커밋 내역만 pick 상태로 두고 나머지는 s(or squash)를 입력합니다.
이후 저장하고 다음 단계로 넘어갑니다.

이후 squash 커밋 메시지를 입력하게 됩니다.

다시 커밋 내역을 확인해 보면 이전과 다르게 커밋메시지는 한개만 확인되어야 합니다.
만약 conflict가 발생하게 되면 git에서 뱉어내는 오류에 따라 차분히 컨플릿 해결을 진행하면 됩니다.

이후 github master(or main)브랜치에 push를 날려 pull request를 요청하면 됩니다.

2. main 브랜치에 접근하여 해결하는 방법

git rebase -i master(or main) <other feature branch>

master와 마스터에 병합할 브랜치를 인자로 작성하여 명령어를 날립니다.

상기에 언급 한 것처럼 가장 오래된 커밋 내역만 pick하고 나머지는 s상태로 바꾸고 저장하고 나옵니다.


요약

  1. main(or master) brach로 이동! github으로부터 main을 pull 받는다.
  2. main branch --> feautre branch로 이동(github에 올리기위한 브랜치)
  3. git rebase -i main 명령어 실행
  4. [rebase 진행시] 가장 오래된 커밋내역을 pick으로하고 다른 커밋은 squash 상태로 변경합니다.(저장하고 나옵니다.)
  5. 저장이후 rebase 커밋 작성을 위한 에디터가 실행되며 커밋 내역을 남깁니다.
  6. 불필요한 내용을 제거하고 현재 수정 내역에 대한 커밋 메시지를 작성합니다.
  7. 저장하고 나옵니다.
  8. git log 명령어를 통해서 정리된 모습을 확인합니다.
  9. git push origin <feature/branch> -f 명령을 이용하여 github origin으로 잡힌(main or master)브렌치에 올립니다.

번외 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를
진행하기 전 상황으로 돌아갈 수도 있습니다.

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글