Тема Решение
Правильная команда для ответа на заданный вопрос может быть любой из следующих (при условии, что ветвь topic
уже извлечена):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
Если topic
не отмечено, вы просто добавляете topic
команду (кроме последней) следующим образом:
git rebase --onto B master topic
В качестве альтернативы, проверьте ветку сначала с:
git checkout topic
Перебазировать любую строку коммитов в целевой коммит
Базовая форма команды, которая нам нужна, взята из документации:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<Branch>
не является обязательным, и все, что он делает, это проверяет ветвь, указанную перед выполнением остальной команды. Если вы уже отметили ветку, которую хотите перебазировать, вам это не нужно. Обратите внимание, что вы должны были указать <Upstream>
, чтобы указать, <Branch>
или git будет думать, что вы указываете<Upstream>
.
<Target>
это коммит, к которому мы прикрепим нашу строку коммитов. Предоставляя имя ветки, вы просто указываете коммит заголовка этой ветки. <Target>
может быть любым коммитом, который не будет содержаться в строке коммитов, которые будут перемещены. Например:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
Чтобы переместить всю ветвь функции, вы не можете выбрать X
, Y
, Z
или , feature
как<Target>
так как те все коммиты внутри группы перемещения.
<Upstream>
особенный, потому что это может означать две разные вещи. Если это коммит, который является предком извлеченной ветви, то он служит точкой вырезания. В этом примере я представил, это было бы ничего , что не C
, D
или master
. Все коммиты после, <Upstream>
пока глава извлеченной ветки не будут перемещены.
Однако если if <Upstream>
не является предком, то git выполняет резервное копирование цепочки из указанного коммита до тех пор, пока if не найдет общего предка с извлеченной ветвью (и не прекратит работу, если не может его найти). В нашем случае, <Upstream>
из B
, C
, D
или master
будет весь результат фиксации , B
выступающим в качестве точки разреза. <Upstream>
сама по себе является необязательной командой, и если она не указана, то git просматривает родителя извлеченной ветви, что эквивалентно вводу master
.
Теперь, когда git выбрал коммиты, которые он будет вырезать и перемещать, он применяет их для того, чтобы <Target>
пропустить все, которые уже применены к цели.
Интересные примеры и результаты
Используя эту отправную точку:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase --onto D A feature
Будет ли применяться фиксаций B
, C
, X
, Y
, Z
совершить D
и в конечном итоге пропуск B
и C
потому , что они уже были применены.
git rebase --onto C X feature
Будет применять коммиты Y
и Z
коммитить C
, эффективно удаляя коммитX
git checkout B
перед запускомgit rebase
?