Git: Как редактировать / перефразировать сообщение коммита слияния?

148

Как мне отредактировать или переформулировать сообщение коммита слияния?

git commit --amendработает, если это последний коммит made ( HEAD), но что, если он наступит раньше HEAD?

git rebase -i HEAD~5 не перечисляет коммиты слияния.

ma11hew28
источник

Ответы:

207

Если вы добавите --preserve-mergesпараметр (или его синоним -p) к git rebase -iкоманде, то git попытается сохранить слияния при перебазировании, а не линеаризировать историю, и вы также сможете изменить коммиты слияния:

git rebase -i -p HEAD~5
Марк Лонгэйр
источник
1
Я сделал это, но после внесения своих изменений, и я пытаюсь подтолкнуть свои изменения, я получаю это! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to
Marc
1
попробуйте запустить git push -f и затем ветку вашего источника. это должно работать. У меня была та же проблема, по какой-то причине это был артефакт перебазирования, потому что в основном произошло то, что после перебазировки у вас получился отдельный хед, так что -force должен это исправить и все подтолкнуть.
Раду Команечи
11
@Marc Это происходит потому, что вы изменили коммиты, которые вы уже отправили. Принудительная передача на сервер считается плохой практикой, поскольку она может полностью десинхронизировать вас и ваших коллег. Ну, если ты один, это не должно быть проблемой.
ibizaman
Где HEAD~5находится родительский коммит, который вы хотите изменить (обычно sha1 ^).
Габриэль Девиллерс
2
--preserve-mergesсейчас--rebase-merges
OrangeDog
32

Обратите внимание, что начиная 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)

VonC
источник
16

Еще один приятный ответ, используя только примитивные команды - от 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 секунд!).

оборота имз - Иван Захарящев
источник
2
Это действительно полезно, сэкономить мне немного времени. Моя компания блокирует некоторые сообщения коммита в репозитории, что легко сделать с помощью --amend или с командами rebase, но: большая проблема, если мы объединяем какую-то ветку с вашей, делаем некоторые коммиты и пытаемся отправить их, блокируемое по умолчанию сообщение git блокируется это должно быть исправлено, я знаю) что заставит нас изменить это сообщение. До этого ответа я много чего пытался изменить сообщение слияния между историей коммитов, но безуспешно.
Джованни Сильва
2

git merge --edit
Позволяет дать комментарий даже в случае неинтерактивного слияния.

git merge --edit --no-ff может быть полезно, если вы следите за потоком мерзавцев, перебирая ветку разработки и сливаясь с ней без быстрой перемотки вперед.

Как-сделать новый
источник
2

Для текущих версий Git (Mai 2020):

git rebase -i -r <parent>,

затем замените в редакторе merge -C ...на merge -c ....

Это откроет сообщение фиксации в редакторе во время перебазирования, где вы можете изменить его.

(Спасибо VonC за подсказку .)

Евгений Лабун
источник
0

Команда git rebase -i HEAD~5выскакивает в редактор. В нем перечислены указанные коммиты (в данном случае пять из них). Первый столбец содержит pickдля каждого коммита. Просто замените pickс rewordв этом редакторе и сохранить + закройте редактор. Тогда мерзавец появится редактор для каждой фиксации , где вы изменили , pickчтобы rewordи позволит вам отредактировать сообщение фиксации.

ChrisD
источник
6
Это не работает для слияния совершить , если вы также добавить -pв git rebaseкоманду.
Пол Прайс
4
отличный ответ, если бы это был другой вопрос
doz87