tl; dr
귀하의 경우 B에 A사용 하는 것 외에 rebase하는 올바른 구문 git rebase --onto은 다음과 같습니다.
git checkout B
git rebase --onto A B^
또는 REBASE B의 상단 A으로부터 시작하는 그의 부모 커밋B 로 참조 B^하거나 B~1.
당신 git rebase <branch>과 의 차이점에 관심이 있다면 git rebase --onto <branch>.
빠른 : 자식 리베이스
git rebase <branch>에 의해 참조 현재 체크 아웃 한 분기를, 리베이스 것입니다 HEAD의 상단에, 최신가에 도달 할 수 커밋 에서 <branch>하지만, 하지 에서 HEAD.
이것은 가장 일반적인 rebasing의 경우이며 아마도 계획을 덜 필요로하는 경우입니다.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
이 예에서 F및 G에서 도달 할 수 branch있지만에서 도달 할 수 없는 커밋입니다 HEAD. 말하는 git rebase branch소요됩니다 D(가) 먼저 분기 시점 이후 커밋입니다, 그리고 그것을 리베이스 (즉, 부모를 변경 에서 연결할 최신의 상단에) 커밋 branch아니라에서 HEAD입니다, G.
정확한 : git rebase --onto 2 arguments
git rebase --onto특정 커밋에서 시작 하여 리베이스 할 수 있습니다 . 리베이트 대상과 위치를 정확하게 제어 할 수 있습니다. 이것은 정확해야하는 시나리오를위한 것입니다.
예를 들어에서 시작하여 HEAD정확하게 리베이스해야한다고 가정 해 봅시다 . 우리는 작업 지점으로 가져 오는 데 관심이 있지만 동시에 호환되지 않는 변경 사항이 포함되어 있기 때문에 유지하고 싶지 않습니다.FEFD
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
이 경우에는이라고 말할 것 git rebase --onto F D입니다. 이것은 다음을 의미합니다.
HEAD부모가 D에 도달 할 수있는 커밋을 리베이스합니다 F.
즉, 의 부모 를 E에서 D로 변경하십시오F . 의 구문은 git rebase --onto입니다 git rebase --onto <newparent> <oldparent>.
이것이 유용한 또 다른 시나리오는 대화식 리베이스 를 수행하지 않고 현재 분기에서 일부 커밋을 빠르게 제거하려는 경우입니다 .
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
이 예에서 순서대로 제거하기 C와 E순서에서 당신은 말할 것입니다 git rebase --onto B E, 또는 리베이스 HEAD위에 B오래된 부모가 어디 E.
외과 의사 : git rebase --onto 3 arguments
git rebase --onto정밀도 측면에서 한 단계 더 나아갈 수 있습니다. 실제로, 임의의 커밋 범위 를 다른 커밋 위에 리베이스 할 수 있습니다 .
예를 들면 다음과 같습니다.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
이 경우, 우리는 정확한 범위 리베이스 할 E---H위에을 F위치를 무시하고, HEAD현재 가리키고 있습니다. 우리는 다음과 같이 말함으로써 그렇게 할 수 있습니다 git rebase --onto F D H.
부모 커밋의 범위 리베이스 D까지 H의 위에을 F.
그러면 커밋 범위git rebase --onto 가있는 구문 이됩니다 . 트릭은 여기에 의해 참조 커밋 것을 기억한다 됩니다 포함 범위와 새로운 될 것 REBASE가 완료된 후.git rebase --onto <newparent> <oldparent> <until><until>HEAD