Ваш вопрос неоднозначен, к счастью, рисунок проливает свет на то, что вы хотите.
Если я правильно понял, это входной статус репо
M--N--P <-- Branch B
/
O--O--X--Y--Z <-- Branch A
и это то, чего вы хотите достичь. Я использовал буквы для обозначения коммитов.
M--Y--Z--N--P <-- Branch B
/
O--O--X
Сначала вам нужно создать новую ветку (C
), указывающую на M
, чтобы она оставалась видимой до конца операции.
git branch C B~2
Замените B~2
фактическим количеством ваших коммитов от N
до B
(включая оба) или используйте абсолютные ссылки (существующие ветки или хэши коммитов).
Следующая команда перемещает N
-P
поверх Z
. Он перемещает все коммиты, которые находятся в B
, но не в C
, поверх A
.
# Move N-P on top of Z (A points to Z, B points to P, C points to M)
git rebase --onto A C B
Последний шаг — переместить все коммиты, находящиеся в B
, но не в C
, поверх C
:
# Move Y-Z-N-P on top of M (B still points to P, A still points to Z)
git rebase C B
Теперь репо выглядит так:
+-- Branch C
v
M--Y'-Z'-N'-P' <-- Branch B
/
O--O--X--Y--Z <-- Branch A
Ветвь A
по-прежнему указывает на исходный коммит Z
; также исходный коммит Y
все еще на месте. Текущая ветка B
.
Коммиты Y'
, Z'
, N'
и P'
являются копиями Y
, Z
, N
и P
. Они отличаются от оригиналов только датой коммита и родителем; нет изменений кода.
Ветки A
и C
теперь можно удалить. (git branch -D A C
).
Подробнее о git rebase
.
person
axiac
schedule
25.01.2018