Тема Решение
Правильная команда для ответа на заданный вопрос может быть любой из следующих (при условии, что ветвь 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?