Легко достичь желаемого результата. Вам нужна следующая команда:
git rebase --onto Bar Foo~3 Foo
Эта форма rebase
, которая принимает две ссылки в качестве аргументов (пока игнорируйте --onto Bar
), является ярлыком для следующих двух команд:
git checkout Foo
git rebase --onto Bar Foo~3
Как это работает
Без --onto Bar
приведенная выше команда rebase
получает коммиты из текущей ветки (Foo
), которые недоступны из Foo~3
, и сохраняет их во временной области. . Затем он сбрасывает текущую ветвь на Foo~3
и применяет сохраненные коммиты один за другим в их исходном порядке.
С --onto Bar
сохранение и восстановление коммитов происходит таким же образом, но начинается восстановление. поверх фиксации, обозначенной Bar
вместо Foo~3
.
В целом, приведенная выше команда берет последние 3 фиксации из ветки Foo
(вместе с веткой Foo
) и помещает их поверх фиксации, идентифицируемой Bar
.
Предупреждение!
Если после того, как вы запустите эту команду, фиксация O
не будет доступна, начиная с ветки, она исчезнет из истории. Снимается не сразу. Вы все еще можете получить к нему доступ, если знаете его ha sh или проверив вывод git reflog
. Git удалит его полностью через некоторое время (обычно около двух недель), если он больше не доступен с помощью ветки, тега или журнала ссылок.
Фактически, сразу ничего не удаляется; даже коммиты, которые git rebase
«перемещены» из одной ветки в другую, были фактически скопированы, а оригиналы все еще находятся в репозитории и доступны, но не видны.
Подробнее о git rebase
на сайте Git или запустите git help rebase
на своем терминале.