git rebase master topic2
git branch -f topic1 HEAD~2 # On (rebased) topic2, set topic1 pointer
Обратите внимание, что это предполагает, что topic1
- это просто указатель на прошлое topic2
, то есть не должно быть никаких коммитов на topic1
, которые не на topic2
. (HEAD~2
предполагает историю коммитов, как показано, на самом деле вы, вероятно, захотите использовать конкретный идентификатор фиксации. Обратите внимание, как это также будет работать, если topic1
даже не существует: поскольку он не имеет коммитов своего «собственного» , указатель может быть установлен произвольно.)
Редактировать : В этом случае вы можете сделать:
git rebase master topic1
git rebase topic1 topic2
Конечный результат должен совпадать с первым параметром (если topic2
содержит все коммиты topic1
!). Этот синтаксис может быть проще для понимания, но решения будут отличаться, если topic1
содержит фиксации, которые не находятся в topic2
. Если это так, то первое решение просто отбрасывает любые коммиты в topic1
, которые не входят в topic2
, тогда как последний объединит их в topic2
. Оба результата, вероятно, нежелательны, но, по моему мнению, из первого решения более ясно, что произойдет, именно поэтому я поставил это на первое место.
Для иллюстрации, если ваша история коммитов выглядит так:
a1 - a2 - a3 - a4 - a5 - a6 - a7 master
\
b1 - b2 - b3 - b4 - b5 topic2
\
c1 topic1
Тогда первое решение (rebase
, branch
) даст вам:
a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - b4' - b5' topic2
\ master \ topic1
И второй (rebase
, rebase
):
a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - c1' - b4' - b5' topic2
\ master \ topic1
Однако в этом случае вы, вероятно, хотели получить:
a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - b4' - b5' topic2
\ master \
c1' topic1
Решение для этого результата будет:
git branch tmp id_of_b3_commit # In this case id_of_b3_commit == topic1^
git rebase master tmp
git rebase tmp topic1
git rebase tmp topic2
git branch -d tmp
(Если вы превратили это в скрипт, вы можете использовать git merge-base topic1 topic2
, чтобы найти идентификатор коммита, который нужно поместить в ветку tmp
.)