Во-первых, обычный отказ от ответственности: то, что вы хотите сделать (т.е. удалить коммиты из ветки), означает переписывание истории , поэтому будьте осторожны.
Предположим, что ваша история выглядит примерно так:
A--B--C--D--E develop
\
F--G feature
И вы хотите "переместить" 1 коммиты B
и C
из develop
в feature
, вы можете сделать это с помощью rebase --onto
команда:
git checkout develop
git rebase --onto feature A C
# This will apply commits B and C on top of the commit referenced by "feature"
Теперь ваша история будет выглядеть так:
A--B--C--D--E develop
\
F--G--B'--C' feature
Обратите внимание, что B'
и C'
(читается " Bпростые"и" C простые") являются новыми коммитами , которые содержат те же изменения, что и B
и C
, но имеют разные идентификаторы фиксации, поскольку у них разные родители.
В этот момент вы можете удалить B
и C
из ветви develop
, сказав:
git rebase --onto A C
# This means rebase the current branch on top of commit A instead of C
, что приведет к фиксации B
и C
noбольше достижимости в develop
:
A--D'--E' develop
A--B--C--D
\
F--G--B'--C' feature
Однако у вас все еще есть feature
, основанный на старом коммите D
, который теперь переписывается как D'
.Чтобы решить эту проблему, вам нужно еще раз перебросить feature
поверх нового D'
:
git checkout feature
git rebase --onto D' D
Наконец получится:
A--D'--E' develop
\
F--G--B'--C' feature
, что, вероятно, то, что выwanted.
1) См. @ WilliamPursell s комментарий о том, что означает "перемещать" коммиты в Git.