Мне пришлось объединить две ветви в другую, и я хотел захватить / записать эту историю.Сначала я попытался слить осьминога, но ветви были слишком разными, и Git отказался выполнить слияние.Чтобы было ясно, задействовано три ветви, а не две.
В качестве альтернативы я извлек нужные мне файлы из каждой ветви, выполнил трехстороннее сравнение с каждым набором файлов, а затем зафиксировал.Для записи истории я тогда использовал git replace --graft
.Помимо необходимости обрабатывать слияние без удержания Git (помимо отслеживания файлов в других ветвях ... что немаловажно), оно прошло хорошо.
Затем я обнаружил, что вместо этогоnew commit является частью собственно ветви, вместо этого он заменяет фактический коммит всякий раз, когда что-то требует его.Это не желательно.Правда, я не знаю никаких недостатков, связанных с обработкой вещей таким способом, но это не значит, что побочных эффектов нет.Кроме того, это выглядит грязно и ненадлежащим образом.
При поиске решения я нахожу, что git filter-branch -- --all
должен добиться цели ... за исключением того, что это не кажется.Во-первых, я ожидал, что по крайней мере хеш заменяющего коммита изменится.Кроме того, ошибки, которые я получаю, указывают на то, что что-то пошло не так.
Rewrite 500495d563d9209cf21d660e7d78d2a7677e570b (291/318) (6 seconds passed, remaining 0 predicted)
WARNING: Ref 'refs/heads/cleanup
WARNING: Ref 'refs/heads/planning' is unchanged
WARNING: Ref 'refs/heads/devel' is unchanged
WARNING: Ref 'refs/remotes/nm/cleanup
WARNING: Ref 'refs/remotes/nm/planning' is unchanged
WARNING: Ref 'refs/remotes/nm/devel' is unchanged
WARNING: Ref 'refs/replace/3ec2686d2ae2ba9e7583836e26e25c7bd0b8aa19' is unchanged
WARNING: Ref 'refs/tags/sent/18-01-11' is unchanged
WARNING: Ref 'refs/tags/sent/18-02-11' is unchanged
WARNING: Ref 'refs/tags/sent/18-10-23' is unchanged
WARNING: Ref 'refs/tags/sent/18-10-24' is unchanged
WARNING: Ref 'refs/tags/sent/18-12-27' is unchanged
WARNING: Ref 'refs/tags/sent/18-12-31' is unchanged
Тогда возникают вопросы: «Как еще я мог это сделать?», «Что-то не так на самом деле пошло не так» и / или «Как я могу это исправить?"Я понимаю, что git graft
- это еще один способ справиться с первым шагом, но (1) кажется, что это какое-то ужасно взломанное вместе решение, и я прочитал его совет, и (2) у меня возникли проблемы с поиском документов по git graft
руководствуЯ верю, что это было удалено в пользу git replace --graft
.
В случае, если это имеет значение, я уже запустил git gc
до запуска git filter-branch
.Я фактически исполнил партию git replace
в начале прошлой недели и только понял, что это может быть хорошей идеей, чтобы "цементировать" коммит сегодня.