rebase

부가 설명
꽤 오래 전의 브랜치에서 따서 작업했을 경우에 유용
Tags
merge
rebase
 

시나리오

  • 꽤 오래전의 develop에서 브랜치 따서 작업중이었는데, 지연됨. - test 라고 명명함
  • 그동안 develop에는 여러 feature들이 붙으면서 앞서감.
  • 그동안 develop에 반영했던 것들 중에 test 브랜치에도 영향을 주는 요소가 있어서, 최신의 develop 브랜치와 맞춘 후에 PR 하고 싶은 경우.
이런 경우에 rebase는 좋은 선택지가 된다.

rebase란?

말 그대로 base를 새로 조정한다는 것을 의미한다.
예전의 develop이 아닌, 현재의 develop을 새로운 기준점으로 삼은 후에, 새로운 base를 시작점으로 현재까지 작업헀던 commit 들을 그 위에 쌓음.
 
새롭게 base를 잡은 후에,
기존의 base 이후로 작업했던 commit 들을 하나씩 점검하면서 새로운 base 위로 커밋을 쌓는다.
그 과정에서 conflict 나는 부분들을 잡으면서 갈 수 있고, 기존의 커밋 외에 별도의 머지 커밋이 남지 않아서 깔끔함!
 

rebase --continue 예시

$ git pull --rebase origin develop
  • feature/#146-Diagnosis-IntegrationTest: feat: 디바이스 진단 명령어 코드 추가
위 커밋은 예전 base를 기준으로 만들어진 오래된 커밋임.
새로운 base 위로 커밋을 생성하려고 하는데 conflict 나는 부분이 있어서 잡힌 상태임.
conflict를 수정하고 git rebase --continue 명령을 치면 수정사항까지 같이 저장됨. (즉 별도의 머지 커밋 따로 생기지 않음)
╭─    ~/Desktop/algocare-device-app   @8a8ebad0 *6 rebase-i 3/12 ~1 ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 ✘  11s   00:43:33  ─╮ ╰─ git rebase --continue ─╯ [HEAD 분리됨 0488110] feature/#146-Diagnosis-IntegrationTest: feat: 디바이스 진단 명령어 코드 추가 1 file changed, 8 insertions(+) 자동 병합: src/lib/constants.ts 충돌 (내용): src/lib/constants.ts에 병합 충돌 자동 병합: src/screens/DiagnosisListScreen.tsx 자동 병합: src/utils/classes/HardwareController.ts error: 다음을 적용할(apply) 수 없습니다: e719243... feature/#146-Diagnosis-IntegrationTest: fix: 프로토콜 문서 업데이트 반영 힌트: Resolve all conflicts manually, mark them as resolved with 힌트: "git add/rm <conflicted_files>", then run "git rebase --continue". 힌트: You can instead skip this commit: run "git rebase --skip". 힌트: To abort and get back to the state before "git rebase", run "git rebase --abort".
 

도식도 설명

  • 좌측이 test 브랜치를 매우 과거에 따서 작업했고, 그동안 develop이 많이 변화된 경우
  • 우측이 rebase를 통해 최신의 develop으로부터 기능 개발이 된 것과 동일해진 경우
    • 새로운 base를 기준으로 commit을 새로 작성한다.
    • 그 과정에서 conflict 나는 부분을 같이 잡아서 반영할 수 있으며, 기존의 커밋들 외에 별도의 머지 커밋을 필요로 하지 않는다.
notion image