Перебазировать коммит с одного родителя на другого - PullRequest
2 голосов
/ 29 мая 2019

У меня есть существующее хранилище, над которым я работаю, но в последнее время я узнал много нового о хороших практиках и о самом git.Я хотел потрясти мою историю по своему вкусу, особенно некоторые ранние коммиты.

Ниже приведен фрагмент текущей истории.Я хочу перебазировать коммит e5cb9b8 на 1a92e84, чтобы у меня был только один / два уровня глубины в графе истории (визуально, смена родителя e5cb9b8).Я пробовал перебазировать

git rebase -p --onto 1a92e84 e5cb9b8 master

и черпать в новую ветку, созданную из 9ecbe00.Cherrypicking возвращает мне историю с ошибками, перебазирование завершается ошибкой со следующим сообщением

ошибка: commit ca230d8c048d22de6f219da8a22e70a773827c38 - это слияние, но опция -m не указана.

неустранимый: cherry-pick fail

Не удалось выбрать ca230d8c048d22de6f219da8a22e70a773827c38

* | 45a0a21 - (7 weeks ago) #17 Updates README.md - Kamil Pacanek
|/
*   ca230d8 - (8 weeks ago) Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts - Kamil Pacanek
|\
| * e5cb9b8 - (8 weeks ago) Adds support for removing parts on ReactorCells - KamilPacanek
* |   1a92e84 - (8 weeks ago) Merge pull request #1 from KamilPacanek/enable-gh-pages - Kamil Pacanek
|\ \
| |/
| * 81761ff - (8 weeks ago) Adds GH Pages support - KamilPacanek
|/
* 9ecbe00 - (8 weeks ago) Initial commit - KamilPacanek

Ожидается:

* | 45a0a21' - (7 weeks ago) #17 Updates README.md - Kamil Pacanek
|/
*   ca230d8' - (8 weeks ago) Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts - Kamil Pacanek
|\
| * e5cb9b8' - (8 weeks ago) Adds support for removing parts on ReactorCells - KamilPacanek
|/
*    1a92e84 - (8 weeks ago) Merge pull request #1 from KamilPacanek/enable-gh-pages - Kamil Pacanek
|\ 
| |
| * 81761ff - (8 weeks ago) Adds GH Pages support - KamilPacanek
|/
* 9ecbe00 - (8 weeks ago) Initial commit - KamilPacanek

Я искал в StackOverflow аналогичные проблемы, и похоже, что никто не описывал такие модификации такглубоко в историю.

Решение

Хорошо, для будущих читателей и для себя я записываю решение для моей проблемы.@alfunx answer был ключом к ее решению - я нашел другое объяснение git rebase и git rebase --onto и начал экспериментировать с моим хранилищем.Методом проб и ошибок мне удалось * достичь ожидаемого графа истории, выполнив

git rebase -ir --onto 1a92e84 81761ff develop

и заменив следующий фрагмент списка задач

label onto

# Branch KamilPacanek/feat/rmb-support-removing-parts
reset onto
pick e5cb9b8 Adds support for removing parts on ReactorCells
label KamilPacanek/feat/rmb-support-removing-parts

# Branch enh/add-uranium-cells
reset 9ecbe00 # Initial commit
merge -C 1a92e84 onto # Merge pull request #1 from KamilPacanek/enable-gh-pages
merge -C ca230d8 KamilPacanek/feat/rmb-support-removing-parts # Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts
label branch-point

следующим (изменил сбросПозиция и удален один, избыточный, фиксация слияния):

label onto

# Branch KamilPacanek/feat/rmb-support-removing-parts
reset onto
pick e5cb9b8 Adds support for removing parts on ReactorCells
label KamilPacanek/feat/rmb-support-removing-parts

# Branch enh/add-uranium-cells
reset onto
merge -C ca230d8 KamilPacanek/feat/rmb-support-removing-parts # Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts
label branch-point

*) На самом деле, было еще многое сделать для достижения этого состояния, но я не хочу запутывать решение второстепенными проблемами.Первая ошибка git rebase с этим сообщением:

ошибка: отказ от обновления ссылки с недопустимым именем 'refs / rewritten / Implement-durability-loss.'

подсказка: не удалось выполнитькоманда todo

подсказка: метка Implement-durability-loss.

Как видите, у меня есть точка в конце сообщения фиксации.После того, как я решил это (с другим ребазом с помощью команды reword), я смог двигаться вперед.

Кроме того, похоже, что git rebase --abort не очищает ссылки, созданные во время git rebase -r .. поэтому у меня был беспорядок в истории.Решил это через rm -rf .git/refs/rewritten.Другое дело, у меня была оставшаяся папка .git / sequencer, которую можно было удалить с помощью git revert --quit.

1 Ответ

2 голосов
/ 29 мая 2019

База, которую вы выбрали для перебазирования, неверна и должна составлять 81761ff вместо e5cb9b8.Я бы посоветовал вам сделать интерактивный перебаз и использовать --rebase-merges вместо --preserve-merges.Таким образом, команда должна быть:

git rebase -ir --onto 1a92e84 81761ff master

Теперь Git, вероятно, произведет еще один коммит слияния.Чтобы избежать этого и получить желаемый результат, вы должны настроить список задач на что-то вроде:

label onto
pick e5cb9b8 Adds support for removing parts on ReactorCells
label new
reset onto
merge -C ca230d8 new
pick 45a0a21 #17 Updates README.md
# Remaining commits...

В списке задач, label может использоваться для отметки текущего коммита (HEAD) и reset можно использовать для установки HEAD для какого-либо коммита / метки.merge, очевидно, используется для создания коммита слияния, -C заставляет слияние использовать то же сообщение коммита, что и исходный коммит слияния.

Это довольно продвинутое и действительно не требуется длябольшинство пользователей и вариантов использования, поэтому, пожалуйста, рассмотрите man git-rebase, раздел Rebase Merges (или онлайн-версия здесь ) для получения более подробной информации.Пример на самом деле очень похож на вашу ситуацию.

...