Как объединить коммиты из двух разных локальных репозиториев, сохраняя последовательность истории изменений?

Как изменить историю коммитов в Git, чтобы сделать коммит **0f6a3f0** предком для коммита **d5c58d8** после слияния двух веток?
  • 17 мая 2024 г. 15:00
Ответы на вопрос 2
Для объединения коммитов из двух разных локальных репозиториев сохраняя последовательность истории изменений, можно использовать команду `git pull --rebase <remote> <branch>`, где `<remote>` - удаленный репозиторий, из которого вы хотите получить изменения, и `<branch>` - ветка, в которую вы хотите влить изменения.

Чтобы изменить историю коммитов в Git, чтобы сделать коммит **0f6a3f0** предком для коммита **d5c58d8** после слияния двух веток, можно выполнить следующие шаги:

1. Переключитесь на ветку, в которую вы хотите влить изменения: `git checkout <branch>`
2. Сделайте слияние веток с опцией `--no-ff`, чтобы создать дополнительный коммит слияния: `git merge --no-ff <ветка>`
3. С помощью команды `git rebase -i HEAD~n`, где `n` - количество коммитов, которые вы хотите изменить, откройте интерактивный режим перебазирования.
4. В открывшемся редакторе поменяйте порядок коммитов так, чтобы коммит **0f6a3f0** стал предком для коммита **d5c58d8**.
5. Сохраните изменения и закройте редактор.
6. Продолжите операцию перебазирования: `git rebase --continue`
7. После завершения перебазирования выполните `git push origin <branch> --force`, чтобы отправить изменения в удаленный репозиторий.

Пожалуйста, помните, что изменение истории коммитов может повлечь за собой проблемы для других участников проекта, поэтому будьте осторожны и убедитесь, что другие разработчики в курсе ваших действий.
Обычный cherry-pick , не? Слияние (merge) сливает ветку изменений целиком, а тут речь именно про ручной отбор, то есть собирание истории вручную? 
git switch master

git cherry-pick second~1
# разрешаем конфликты, если надо
git cherry-pick --continue # если были конфликты

git cherry-pick second
# аналогично с конфликтами и продолжением

Аналогичного результата можно было бы добиться и при помощи перебазирования second на master , но оно приведет к нужному результату только если нет этих самых unrelated histories , ибо при их наличии начнет перетаскивать историю от сотворения мира. Для двух коммитов ручной перенос — самый простой и употребительный вариант, поменяется только дата коммита.
Похожие вопросы