Ответы:
Если вы добавите --preserve-merges
параметр (или его синоним -p
) к git rebase -i
команде, то git попытается сохранить слияния при перебазировании, а не линеаризировать историю, и вы также сможете изменить коммиты слияния:
git rebase -i -p HEAD~5
HEAD~5
находится родительский коммит, который вы хотите изменить (обычно sha1 ^).
--preserve-merges
сейчас--rebase-merges
Обратите внимание, что начиная git1.7.9.6 (и git1.7.10 +), git merge
он всегда будет запускать редактор , чтобы вы добавляли детали к слиянию.
«
git merge $tag
» для слияния аннотированного тега всегда открывает редактор во время сеанса интерактивного редактирования. Серия v1.7.10 представила переменную среды GIT_MERGE_AUTOEDIT, чтобы помочь старым сценариям отказаться от этого поведения, но дорожка обслуживания также должна поддерживать ее.
Он также вводит переменную окружения, GIT_MERGE_AUTOEDIT
чтобы помочь старым сценариям отказаться от этого поведения.
Смотрите « Предвидение Git 1.7.10 »:
Недавно в обсуждении списка рассылки Git Линус признал (и я согласился), что это была одна из ошибок проектирования, которые мы допустили в начале истории Git.
И в 1.7.10 и позже, команда git merge, которая запускается в интерактивном сеансе (т. Е. Как ее стандартный ввод, так и стандартный вывод, подключенный к терминалу), откроет редактор перед созданием коммита для записи результата слияния, чтобы дать пользователь может объяснить слияние, как команда git commit, которую пользователь запускает после разрешения конфликтующего слияния.
Линус сказал:
Но мне не очень важно, как это работает на самом деле - моя главная проблема в том, что git делает слишком легким получение плохих сообщений слияния.
Я думаю, что отчасти это еще более простой идиотизм: мы никогда не запускаем редактор по умолчанию для «git merge», но мы делаем для «git commit
».
Это было ошибкой дизайна, и это означает, что если вы хотите добавить заметку к слиянию, вам нужно проделать дополнительную работу. Так люди не делают .
Обратите внимание, что до Git 2.17 (Q2 2018) " git rebase -p
" искаженные сообщения журнала фиксации слияния, которая теперь исправлена.
См. Комм. Ed5144d (08 февраля 2018 г.) Грегори Эрреро (``) . Предложено
: Вегард Носсум ( vegard
) и Квентин Касасновас ( casasnovas
) .
(Слиты Junio C Hamano - gitster
- в фиксации 8b49408 , 27 Feb 2018)
rebase -p
: исправить некорректное сообщение при звонкеgit merge
.Поскольку commit dd6fb00 ("
rebase -p
: исправлять кавычки при вызовеgit merge
", январь 2018 г., Git 2.16.0-rc2), сообщение коммита перебазируемого коммита слияния передается команде слияния с использованием подоболочки, выполняющей 'git rev-parse --sq-quote
'.Двойные кавычки необходимы вокруг этой подоболочки, так что для
git merge
команды сохраняются символы новой строки .Перед этим патчем следующее сообщение о слиянии:
"Merge mybranch into mynewbranch Awesome commit."
будет выглядеть так:
"Merge mybranch into mynewbranch Awesome commit."
после
rebase -p
.
С Git 2.23 (Q2 2019), " merge -c
" инструкция во время " git rebase --rebase-merges
" должна дать пользователю возможность редактировать сообщение журнала, даже если в противном случае нет необходимости создавать новое слияние и заменять существующее (например, быстрая перемотка вперед). ), но не сделал.
Который был исправлен.
См. Коммит 6df8df0 (02 мая 2019 г.) Филиппа Вуда ( phillipwood
) .
(Слиты Junio C Hamano - gitster
- в фиксации c510261 , 13 июня 2019)
Еще один приятный ответ, используя только примитивные команды - от knittl https://stackoverflow.com/a/7599522/94687 :
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
или лучшая (более правильная) последняя команда rebase:
git rebase <sha of merge> previous_branch --onto HEAD
Кстати, использование примитивных команд может иметь приятную «особенность», заключающуюся в том, что вы не потребляете слишком много ресурсов ЦП и заставляете вас ждать неизвестное время, пока Git не закончит думать о списке коммитов, которые необходимо перебазировать в случае git rebase -p -i HEAD^^^^
(такая команда, которая приведет к список только 4 последних коммитов с слиянием, так как последний в моем случае в моем случае занял около 50 секунд!).
git merge --edit
Позволяет дать комментарий даже в случае неинтерактивного слияния.
git merge --edit --no-ff
может быть полезно, если вы следите за потоком мерзавцев, перебирая ветку разработки и сливаясь с ней без быстрой перемотки вперед.
Для текущих версий Git (Mai 2020):
git rebase -i -r <parent>
,
затем замените в редакторе merge -C ...
на merge -c ...
.
Это откроет сообщение фиксации в редакторе во время перебазирования, где вы можете изменить его.
Команда git rebase -i HEAD~5
выскакивает в редактор. В нем перечислены указанные коммиты (в данном случае пять из них). Первый столбец содержит pick
для каждого коммита. Просто замените pick
с reword
в этом редакторе и сохранить + закройте редактор. Тогда мерзавец появится редактор для каждой фиксации , где вы изменили , pick
чтобы reword
и позволит вам отредактировать сообщение фиксации.
-p
в git rebase
команду.
! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to