ТЛ; др
Правильный синтаксис для перебазирования Bповерх Aиспользования git rebase --ontoв вашем случае:
git checkout B
git rebase --onto A B^
или перебазировать Bповерх Aначала коммита, который является родителемB ссылки с B^или B~1.
Если вы заинтересованы в разнице между git rebase <branch>и git rebase --onto <branch>читать дальше.
Быстрый: git rebase
git rebase <branch>собирается перебазировать ветку, которую вы в настоящее время извлекли, на которую ссылается HEAD, поверх последнего коммита, который доступен из, <branch>но не из HEAD.
Это наиболее распространенный случай перебазирования и, возможно, тот, который требует меньше планирования заранее.
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 аргументами
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 аргументами
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, что означает:
Rebase диапазон коммитов , чей родитель Dдо Hсверху F.
Синтаксис git rebase --ontoс диапазоном коммитов затем становится git rebase --onto <newparent> <oldparent> <until>. Хитрость здесь помнить , что фиксация ссылается <until>будет включен в диапазон и станет новым HEADпосле перебазироваться завершения.