ТЛ; др
Правильный синтаксис для перебазирования 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
после перебазироваться завершения.