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
정확하게 리베이스해야한다고 가정 해 봅시다 . 우리는 작업 지점으로 가져 오는 데 관심이 있지만 동시에 호환되지 않는 변경 사항이 포함되어 있기 때문에 유지하고 싶지 않습니다.F
E
F
D
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