Я немного играл с rebase, пытаясь разделить и объединить историю, как описано здесь: https://git-scm.com/book/en/v2/Git-Tools-Replace
Вот мой тестовый репозиторий с разделенной историей: https://github.com/defufna/split-history
![](https://i.stack.imgur.com/5HLek.png)
Обратите внимание, что «первоначальная фиксация» и «добавленное описание» фиксируют обе точки в одном и том же дереве. То, что я пытаюсь сделать, это объединить эти две истории (сохраняя слияния). Я использовал это:
git rebase --rebase-merges --onto history 94da9b0f
Это работает, но я получаю конфликт в 084dae5. Это слияние, которое разрешает конфликт изменения / удаления, и требует, чтобы я разрешил этот конфликт вручную.
Я делаю это в рамках подготовки к гораздо большему слиянию репо, где мне придется делать что-то подобное, но с коммитами по 50 тыс., Поэтому я бы хотел избежать ручного разрешения конфликтов. Я знаю, что git замена может решить мою проблему, но мне любопытно, если это возможно сделать без замены. Я также хотел бы сохранить значения sha коммитов в ветке истории.
Edit:
Так что мне удалось сделать то, что я хочу, но я не уверен, насколько хороша эта идея. Я добавил -i, чтобы перебазировать, и когда я получил файл todo, я изменил каждую
merge -C 9751be2 Merge # Merge
строку на:
exec git checkout `git commit-tree '9751be2^{tree}' -p HEAD -p refs/rewritten/Merge -m Merge`
Я в основном говорю git всякий раз, когда встречается слияние для повторного использования дерева из исходного слияния.
Работает как положено (пока), но намного медленнее. Есть ли лучший способ сделать это?