tl; dr
Poprawna składnia do rebase B
na górze A
używając git rebase --onto
w Twoim przypadku jest:
git checkout B
git rebase --onto A B^
lub rebase B
na początku A
od 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 HEAD
się 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 F
i G
są zatwierdzeniami, które są dostępne z, branch
ale nie z HEAD
. Powiedzenie git rebase branch
weźmie D
, to jest pierwszy zatwierdzenie po punkcie rozgałęzienia, i ponownie go oprze (tj. Zmieni jego rodzica ) na najnowszym zatwierdzeniu osiągalnym od, branch
ale nie od HEAD
, to znaczy G
.
Precyzja: git rebase --onto z 2 argumentami
git rebase --onto
pozwala 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 HEAD
dokładnie zmienić bazę , F
zaczynając od E
. Jesteśmy zainteresowani tylko wprowadzeniem F
do naszej działającej gałęzi, a jednocześnie nie chcemy zachować, D
ponieważ 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, HEAD
którego rodzic jest D
na wierzchu F
.
Innymi słowy, zmień rodzica z E
z D
na F
. Składnia git rebase --onto
jest 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ąć C
iz E
sekwencji, możesz powiedzieć git rebase --onto B E
, lub zmienić bazę HEAD
na miejscu, w B
którym był stary rodzic E
.
The Surgeon: git rebase --onto z 3 argumentami
git rebase --onto
jeś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---H
na górze F
, ignorując miejsce, na które HEAD
aktualnie wskazuje. Możemy to zrobić, mówiąc git rebase --onto F D H
, co oznacza:
Rebase zakresu zatwierdzeń, których rodzic jest D
maksymalnie H
na górze F
.
Następnie składnia git rebase --onto
z 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 HEAD
po zakończeniu rebase.