Подтвердить что ты не робот

Изменение сообщения Git commit, сделанного до слияния

Я совершил некоторый тестовый код перед слиянием в удаленной ветке. У этого слияния было много конфликтов и потребовалось какое-то серьезное время, чтобы поправить это. Итак, моя история выглядит примерно так:

7ab562c Merge from remote branch
... whole load of commits brought across from the remote branch...
f3e71c2 Temporary TESTING COMMIT

Тест-код в порядке, я просто хочу изменить сообщение фиксации. Обычно я бы пошел прямо с git rebase -i f3e71c2^ (так как ни одно из них еще не было нажато), но мне сказал коллега, что это испортит слияние. Я действительно не хочу испортить слияние:)

Правильно ли мой коллега? И если да, могу ли я что-нибудь сделать, или мне просто нужно жить с этой историей?

4b9b3361

Ответ 1

Вы можете попробовать git rebase --preserve-merges --interactive, используя:

-p
--preserve-merges

Вместо игнорирования слияний попытайтесь их воссоздать.

Раздел BUG на странице руководства включает в себя:

Список todo, представленный --preserve-merges --interactive, не представляет топологию графика ревизии.
Редактирование коммиттов и их переписывание сообщений фиксации должно работать нормально, но попытки переупорядочить фиксации, как правило, приводят к противоречивым результатам.


Как jthill comment описывает (поскольку -p будет лучше сохранять слияния, если конфликт резолюции были записывающими):

Вы можете ретроактивно светить ререр для слияния:

git config rerere.enabled true
git checkout $merge^1
git merge $merge^2
git read-tree --reset -u $merge
git commit -m-
git checkout @{-1}

Ответ 2

Если и только если ваши коллеги не нажали/вытащили изменения на f3e71c2 в другом месте, это будет работать. В противном случае я не знаю, что произойдет. Изменение сообщения фиксации полностью косметическое (== изменение метаданных), учитывая, что вы еще не push редактировали коммит, который хотите изменить, но это все равно может привести к путанице в истории, если ваши коллеги нажали/вытащили какую-либо часть история, которая на нем.

(благодаря Abizern для указания этого режима отказа)