У меня есть такое дерево:
(commit 1) - master
\-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
и мне нужно переместить ветку PRO в master
(commit 1) - master
|-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
Я пробовал git rebase master
от PRO ветки, но ничего не происходит.
Чтобы уточнить : я работал в мастере, а затем мне пришлось сделать демонстрацию продукта ( git checkout -b demo
и некоторые коммиты). Затем по ошибке я создаю другую ветку из демо ( git checkout -b PRO
и некоторые коммиты), и теперь мне нужно переместить PRO ветку в мастер и оставить демо нетронутым. В конце концов, и demo, и PRO будут зависать от мастера.
Ответы:
Используйте
--onto
для этого:Учитывая ваш случай:
По сути, вы берете все коммиты от
demo
доPRO
и переустанавливаете их наmaster
коммит.источник
git rebase --onto first-branch second-branch second-branch
git rebase --onto first-branch master second-branch
--onto
, и как они написали мне помогgit rebase --onto newBase oldBase feature/branch
origin/newBase
- это имя ветки, какnewBase
в моем примере. Это будет просто зависеть от того, выполняете ли вы переустановку на ветку, которая существует в вашем локальном репозитории (newBase
), или на ветку, которая существует в удаленном (origin/newBase
).newBase
- это имя локальной ветки иorigin/newBase
имя удаленной ветки. То, что вы хотите, зависит от того, на что вы перебираете. Дело не в том, что один работает, а другой нет, дело в том, что они переключаются на разные вещи. В исходном вопросе не упоминаются пульты дистанционного управления, поэтому использование пультов в моем примере не соответствует заданному вопросу.Я постараюсь быть как можно более универсальным. Сначала убедитесь, что вы находитесь на нужной ветке:
Затем используйте следующую команду (где
new-base-branch
находится ветка, которую вы хотите использовать в качестве новой базы, иcurrent-base-branch
ветка, которая является вашей текущей базой).Если у вас нет конфликтов, то отлично - готово. Если да (в большинстве случаев), продолжайте читать.
Могут возникнуть конфликты, и вам придется разрешать их вручную. Git Теперь пытается сделать «3-полосные слияния» между вашим
current-branch
,current-base-branch
иnew-base-branch
. Примерно так git будет работать внутри:Git сначала перебазирует
current-base-branch
сверхуnew-base-branch
. Могут быть конфликты; который вам придется решать вручную. После того, как это сделано, вы обычно делаетеgit add .
иgit rebase --continue
. Для этого будет создана новая временная фиксацияtemp-commit-hash
.После этого Git перебазирует ваш файл
current-branch
поверхtemp-commit-hash
. Могут возникнуть новые конфликты, и вам снова придется решать их вручную. После этого вы снова продолжите работу сgit add .
иgit rebase --continue
, после чего вы успешно переустановили свойcurrent-branch
поверхnew-base-branch
.Примечание. Если вы начнете ошибаться, вы можете сделать это в
git rebase --abort
любой момент во время процесса перебазирования и вернуться к исходной точке.источник
rebase
команда просто дает мне «фатальный: недопустимый восходящий поток 'current-base-branch'». Кроме того, почему вообще необходимо указывать GIT, что такое текущая родительская ветвь текущей ветки - разве он уже не знает об этом?Оформить заказ в
PRO
ветку, скопируйте самый старый ( commit4 ) и последний ( commit5 ) хеши фиксации этой ветки и вставьте в другое место:Удалите
PRO
ветку (на всякий случай сохраните резервную копию). Создать и оформить заказ в новуюPRO
ветку изmaster
:Возьмите ( выделите ) диапазон коммитов предыдущей
PRO
ветки в новуюPRO
ветку:Теперь, если все в порядке, нажмите принудительно (-f) на
remote PRO
ветвь и удалите локальнуюPRO.bac
ветку:источник
У меня был немного другой подход с использованием сброса и тайников, который позволяет избежать удаления и повторного создания ветвей, а также избавляет от необходимости переключать ветки:
Сбрасывая ветку на основе фиксации за фиксацией, вы в основном просто перематываете эту историю ветвей по фиксации за раз.
источник