Слияние истории раскола в git - PullRequest
7 голосов
/ 11 февраля 2020

Я немного играл с rebase, пытаясь разделить и объединить историю, как описано здесь: https://git-scm.com/book/en/v2/Git-Tools-Replace

Вот мой тестовый репозиторий с разделенной историей: https://github.com/defufna/split-history

Обратите внимание, что «первоначальная фиксация» и «добавленное описание» фиксируют обе точки в одном и том же дереве. То, что я пытаюсь сделать, это объединить эти две истории (сохраняя слияния). Я использовал это:

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 всякий раз, когда встречается слияние для повторного использования дерева из исходного слияния.

Работает как положено (пока), но намного медленнее. Есть ли лучший способ сделать это?

1 Ответ

4 голосов
/ 14 февраля 2020

Обратите внимание, что "initial commit" [94da] и "Added description" [c00e] фиксирует обе точки в одном и том же дереве

Есть ли лучший способ сделать это ?

Многое.

git replace --graft 94da c00e^
git filter-branch master

и все готово.

git rebase существует для повторного применения изменений к другому базовому контенту, создавая снимки с новым контентом. У вас уже есть все снимки, которые вы хотите, вам нужно только переписать родословную. git replace --graft делает это локально, что позволяет вам экспериментировать случайно. git filter-branch существует, чтобы запекаться в переписанной родословной, применяя любые сверхлегкие изменения содержания - но у вас даже нет таких изменений. Вы просто хотите переписать историю master.

...