tl; dr
Poprawna składnia do rebase Bna górze Aużywając git rebase --ontow Twoim przypadku jest:
git checkout B
git rebase --onto A B^
lub rebase Bna początku Aod zatwierdzenia, które jest rodzicem, do któregoB odwołuje się B^lub B~1.
Jeśli interesuje Cię różnica między git rebase <branch>i git rebase --onto <branch>czytaj dalej.
Szybki: git rebase
git rebase <branch>ma zamiar ponownie bazować gałąź, którą aktualnie sprawdzałeś, do której odwołuje HEADsię najnowszy zatwierdzenie, które jest dostępne z, <branch>ale nie z HEAD.
Jest to najczęstszy przypadek zmiany bazy i prawdopodobnie ten, który wymaga mniej planowania z góry.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
W tym przykładzie Fi Gsą zatwierdzeniami, które są dostępne z, branchale nie z HEAD. Powiedzenie git rebase branchweźmie D, to jest pierwszy zatwierdzenie po punkcie rozgałęzienia, i ponownie go oprze (tj. Zmieni jego rodzica ) na najnowszym zatwierdzeniu osiągalnym od, branchale nie od HEAD, to znaczy G.
Precyzja: git rebase --onto z 2 argumentami
git rebase --ontopozwala na zmianę bazy zaczynając od określonego zatwierdzenia . Daje ci dokładną kontrolę nad tym, co jest zmieniane i gdzie. Dotyczy to scenariuszy, w których musisz być precyzyjny.
Na przykład wyobraźmy sobie, że musimy HEADdokładnie zmienić bazę , Fzaczynając od E. Jesteśmy zainteresowani tylko wprowadzeniem Fdo naszej działającej gałęzi, a jednocześnie nie chcemy zachować, Dponieważ zawiera pewne niekompatybilne zmiany.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
W tym przypadku powiedzielibyśmy git rebase --onto F D. To znaczy:
Przywróć zatwierdzenie osiągalne, HEADktórego rodzic jest Dna wierzchu F.
Innymi słowy, zmień rodzica z Ez Dna F. Składnia git rebase --ontojest zatem git rebase --onto <newparent> <oldparent>.
Innym scenariuszem, w którym jest to przydatne, jest sytuacja, gdy chcesz szybko usunąć niektóre zatwierdzenia z bieżącej gałęzi bez konieczności wykonywania interaktywnej rebase :
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
W tym przykładzie, aby usunąć Ciz Esekwencji, możesz powiedzieć git rebase --onto B E, lub zmienić bazę HEADna miejscu, w Bktórym był stary rodzic E.
The Surgeon: git rebase --onto z 3 argumentami
git rebase --ontojeśli chodzi o precyzję, może pójść o krok dalej. W rzeczywistości pozwala na przeniesienie dowolnego zakresu zatwierdzeń na inny.
Oto przykład:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
W tym przypadku chcemy zmienić dokładny zakres E---Hna górze F, ignorując miejsce, na które HEADaktualnie wskazuje. Możemy to zrobić, mówiąc git rebase --onto F D H, co oznacza:
Rebase zakresu zatwierdzeń, których rodzic jest Dmaksymalnie Hna górze F.
Następnie składnia git rebase --ontoz zakresem zatwierdzeń staje się git rebase --onto <newparent> <oldparent> <until>. Sztuczka polega na tym, że należy pamiętać, że zatwierdzenie, do którego odwołuje się, <until>jest zawarte w zakresie i stanie się nowym HEADpo zakończeniu rebase.