rebase란?

  • git에서 두개의 브랜치를 합치는데에 두가지 방법중 하나
    • Merge와 Rebase 이렇게 두가지 존재한다.
  • 하지만 대부분 Merge를 자주 사용하고, Rebase는 위험하다고 자주 듣는다.
  • 왜 위험한지와 어떻게 작동하는지 정리해본다.

작동방식

  • a라는 브랜치를 기준으로 b1, b2로 나뉜 두 브랜치가 존재할때
  • b2에서 rebase b1을 진행한다면?
    • b1과 b2의 공통부모인 a를 확인
    • a부터 현재 b2까지의 변경내역(diff)를 임시로 저장
    • b1으로 이동하여 저장된 변경내역들을 차례로 적용한다.
    • 그럼 a-b1-b2'와 같이 1줄로 만들어지게 된다.
  • 결국 rebase란 현재까지의 변경사항들을 목표로 하는 브랜치의 히스토리로 적용하는 것이다.
  • 위와 같은 a,b1,b2의 상황에서 merge를 한다면 같은 결과가 만들어지지만 무엇이 다를까

merge와 차이점

  • 브랜치의 log, 히스토리 내역의 차이가 있다.
  • merge는 두 브랜치가 하나로 합쳐지는 형태로 보여진다.
  • rebase는 선형으로 만들어져 좀더 깔끔한 형태를 보여준다.
  • 이런 이유로 커밋을 깔끔하게 적용하고 싶을때 사용한다고 한다.

옵션

--onto옵션

  • git rebase --onto <newbase> <upstream> <branch>

    • newbase는 이동할 브랜치
    • upstream은 제외할 브랜치
    • branch는 재배치할 브랜치
    • 사용시 재배치할 브랜치로 checkout한다음 사용하면 된다.
  • 특정 브랜치의 변경내역을 제외하고 rebase할때 사용한다.
    • 만약 a브랜치로 부터 main, dev로 나뉘어 있고 dev에서 serv, cli로 나뉘어있다고 가정
    • 이럴때 main에 serv가 관여한것을 제외하고 cli브랜치에서의 변경사항만 main에 합치는게 가능
  • 이렇게 하면 오로지 cli브랜치에서 작업한 내용만 main으로 적용이 가능하다.
  • 브랜치 변경사항을 유연하게 재배치하고 원하는 커밋위에 다시 적용이 가능

interative 옵션

  • -i로 rebase를 수행할때 대화형으로 작업하는 기능이다.
  • 해당 옵션을 사용하면 아래의 명령어를 활용해 작업이 가능하다.
    • pick: 커밋을 그대로 둡니다.
    • reword: 커밋 메시지를 수정합니다.
    • edit: 커밋을 수정하고 커밋 내용을 변경합니다.
    • squash: 커밋을 이전 커밋과 합칩니다.
    • fixup: 커밋을 이전 커밋과 합치고, 현재 커밋 메시지를 무시합니다.
    • drop: 커밋을 삭제합니다.
  • 이를 통해 특정 커밋을 수정, 편집이 가능하다.

위험성

  • 이미 공개 저장소에 push 한 커밋을 rebase하지 않기
    • rebase는 기존 커밋을 그대로 사용이 아닌, 다른 커밋을 새로 만든다.
  • rebase는 로컬에서 작업할때 히스토리 정리할때 사용해야 한다.

참고