git rebase --onto
Written by Chat GPT 5
Git Rebase --onto 완벽 가이드
Rebase --onto란 무엇인가
git rebase --onto
는 특정 구간의 커밋만 떼어내어 새로운 베이스 위에 재배치하는 강력한 도구입니다. 단순 git rebase
와 달리, “어디까지를 잘라낼지”와 “어디 위에 붙일지”를 모두 명시할 수 있습니다.
명령어 형식은 다음과 같습니다.
git rebase --onto <NEWBASE> <UPSTREAM> [<BRANCH>]
<UPSTREAM>..[<BRANCH>]
범위에 해당하는 커밋들을 잘라냅니다.- 그 커밋들을
<NEWBASE>
위에 다시 적용(cherry-pick)합니다. <BRANCH>
를 생략하면 현재 체크아웃된 브랜치가 대상입니다.
직관적 이해
머릿속에 그리면 이렇게 됩니다.
전 상태:
U0──U1──U2 (origin/dev)
\
A──B──C (feature)
원하는 상태:
M0──M1 (origin/main)
\
A'──B'──C' (feature rebased)
즉, origin/dev..feature
에 속하는 A, B, C
만 골라 origin/main
위로 옮기는 것입니다.
실무 시나리오: dev 머지가 섞인 feature를 main으로 보내야 할 때
자주 있는 케이스는 다음과 같습니다.
- feature를 dev에서 분기했음
- dev가 main보다 먼저 갱신됨
- feature에 dev를 머지했더니, feature → main PR에 dev의 커밋까지 섞여버림
이 경우 해결책은:
git fetch --all
git switch feature
git rebase --onto origin/main origin/dev feature
git push --force-with-lease
이제 feature는 main을 기반으로 하고, feature 고유 커밋만 남습니다.
활용 패턴 모음
브랜치 베이스 갈아타기
git rebase --onto origin/main origin/dev topic
topic
을 dev에서 파생했는데 main으로 타겟을 바꾸고 싶을 때.
중간 구간 삭제
git rebase --onto B D branch
브랜치의 C, D를 빼고 E, F만 이어 붙이는 효과.
마지막 N개 커밋만 옮기기
git rebase --onto newbase HEAD~N
가장 최근 N개만 새로운 베이스로 옮김.
feature 전용 커밋만 유지
git rebase --onto origin/main origin/dev feature
dev와 겹치는 부분은 버리고 feature만 main 위에 올림.
안전하게 사용하는 방법
-
백업 브랜치 생성
git branch backup/feature
-
리베이스 전 상태 확인
git log --oneline --graph --decorate --all
-
리베이스 후 검증
git range-diff origin/dev..feature@{1} origin/main..feature git diff origin/main...feature
-
문제 시 복원
git reflog git reset --hard backup/feature
충돌 처리 요령
- 충돌 발생 → 수정 →
git add <file>
→git rebase --continue
- 현재 커밋 스킵 →
git rebase --skip
- 전체 중단 →
git rebase --abort
충돌이 많다면 cherry-pick
전략으로 나누어 처리하는 것도 좋습니다.
merge와의 차이
- merge: 두 브랜치를 합쳐서 새 merge 커밋 생성 → 히스토리 복잡, 불필요한 커밋 포함됨
- rebase --onto: 특정 커밋만 선택적으로 새 베이스에 재배치 → 선형적이고 깔끔한 히스토리
브랜칭 전략에서의 교훈
- 최종 타겟이 main이면 feature는 main에서 분기해야 합니다.
- dev를 섞지 말고, 필요 시
git rebase origin/main
으로 최신화합니다. - 만약 dev를 합쳐버렸다면
git rebase --onto origin/main origin/dev feature
로 정리하는 습관을 들이세요.