git rebase는 Git에서 브랜치 간의 변경 사항을 합치거나 재배치하는 명령어다.
주로 두 개의 브랜치를 통합하거나, 커밋 히스토리를 깔끔하게 정리할 때 사용된다.
기본적으로 rebase는 지정한 브랜치의 커밋들을 다른 브랜치의 맨 위로 이동시켜서 새로운 커밋 히스토리를 만든다.
rebase는 merge보다 더 깔끔한 히스토리를 유지할 수 있다. merge는 여러 커밋을 한 번에 합치기 때문에 히스토리가 복잡해질 수 있는데, rebase는 각 커밋을 하나씩 위로 올려서 히스토리를 더 깔끔하게 유지할 수 있다.
한 브랜치에서 다른 브랜치의 변경 사항을 적용하려 할 때, rebase를 사용하여 변경 사항을 차례로 적용할 수 있다.
다음은 feature 브랜치에서 작업할 때, main 브랜치의 최신 커밋을 feature 브랜치에 반영하는 방법이다.
git checkout feature // feature 브랜치로 이동
git rebase main // main 브랜치에 반영
이 명령을 실행하면 feature 브랜치의 커밋들이 main 브랜치 위로 이동되어 feature 브랜치가 main 브랜치의 최신 커밋을 기반으로 하게 된다.
이때, rebase는 feature 브랜치의 커밋들을 순차적으로 main 브랜치 위로 올린다.
rebase 중에는 종종 충돌이 발생할 수 있다.
충돌이 발생하면 수동으로 충돌을 해결해야 한다. 충돌을 해결한 후에는 rebase를 계속 진행할 수 있다.
git add <충돌 해결한 파일>
git rebase --continue
rebase는 커밋 히스토리를 재작성하므로, 원격 저장소에 푸시할 때는 강제로 푸시해야 할 수 있다.
보통 rebase 후에는 다음과 같이 --force 옵션을 사용하여 푸시한다.
git push --force
그러나 강제 푸시는 다른 팀원들의 작업에 영향을 미칠 수 있으므로, git push --force-with-lease를 사용해 원격 저장소의 상태를 확인한 후 푸시하는 것이 안전하다.
git push --force-with-lease
git merge는 두 브랜치를 병합할 때 각 브랜치의 커밋을 하나로 합친다. 이 과정에서 병합 기록이 남기 때문에 언제, 어떤 브랜치에서 병합이 있었는지 알 수 있다. 하지만 커밋 히스토리가 복잡해질 수 있다.
git rebase는 커밋 히스토리를 깔끔하게 유지할 수 있지만, 커밋 히스토리를 변경하는 작업이므로 주의해서 사용해야 한다. 특히 이미 원격 저장소에 푸시된 커밋을 변경하려면 강제 푸시(--force)가 필요하므로, 팀원들이 함께 작업하는 브랜치에서는 신중하게 사용해야 한다.