Прежде всего, убедитесь, что у вас нет незафиксированных изменений.Либо фиксируйте, либо храните их раньше всего.
Затем создайте временную ветвь или тег, указывающий на фиксацию E
.Если что-то пойдет не так, вы можете использовать его (с проверкой и полным сбросом), чтобы восстановить положение branch1
и начать все сначала.После достижения желаемого результата вы можете удалить ветку или тег.
Вы можете получить желаемую структуру следующим образом:
# Make branch `branch2` point to commit `E`
git checkout branch2
git rebase branch1
# Move `branch1` onto its desired destination (2 commits behind its current position)
git checkout branch1
git reset --hard HEAD~2
# Get back to branch2
git checkout branch2
# Rebase its most recent 2 commits (D and E) on top of B
git rebase --onto HEAD~3 HEAD~2
В качестве альтернативы вы можете перефразировать последнюю команду как git rebase --onto branch1~1 branch1
.
Перемещает коммиты, которые достижимы из текущей ветви (branch2
, которая указывает на коммит E
), но недоступны из ветви branch1
поверх коммита branch1~1
(родительский элемент branch1
).Таким образом, строка истории, которая начинается с branch1
(кроме branch1
), перемещается как родной элемент branch1
(или везде, где говорится в аргументе --onto
).
Прочитайте документация git rebase
для получения дополнительной информации о том, как git rebase
работает.