Как мне отредактировать неверное сообщение о коммите в git (которое я нажал)? - PullRequest
149 голосов
/ 19 января 2009

Я хочу изменить сообщение коммита глубже в истории, и я выдвинул много новых коммитов.

Как мне изменить сообщение коммита? Возможно ли это?

Ответы [ 6 ]

124 голосов
/ 19 января 2009

Сообщение от Линуса Торвальдса может ответить на ваш вопрос:

Изменение / редактирование старых сообщений коммита

Краткий ответ: вы не можете (если нажали).


выдержка (Линус называет BitKeeper BK):

Примечание, просто из исторического интереса: в БК вы могли бы.

И если вы к этому привыкли (как я), это было действительно довольно практично. я применил бы патч-бомбу от Эндрю, заметил, что что-то не так, и просто отредактируйте это прежде, чем выдвинуть это.

Я мог бы сделать то же самое с мерзавцем. Было бы достаточно легко сделать просто сообщение коммита не быть частью имени, и все же гарантировать что история осталась нетронутой, и позволяют «исправить комментарии позже» вещь.

Но я не сделал.

Отчасти это чисто «внутренняя согласованность». Git - это просто уборщик система благодаря тому, что все защищено SHA1, а все объекты обрабатываются одинаково, независимо от типа объекта. Да, есть четыре различные виды объектов, и все они действительно разные, и они не могут быть использованы таким же образом, но в то же время, даже если их на диске кодировка может быть разной, концептуально все они работают точно то же самое.

Но внутренняя согласованность не является оправданием для негибкости, и очевидно, было бы очень гибко, если бы мы могли просто исправить ошибки после они случаются. Так что это не очень сильный аргумент.

Причина real git не позволяет вам изменить сообщение об окончании быть очень простым: таким образом, вы можете доверять сообщениям. Если бы вы позволили люди, чтобы изменить их потом, сообщения по своей сути не очень заслуживающее доверие.


Чтобы завершить, вы могли бы переписать свою локальную историю коммитов, чтобы отразить то, что вы хотите, как предложено sykora (с некоторой перебазировкой и сбросом --hard, gasp! )

Однако, как только вы публикуете свою пересмотренную историю снова git push origin +master:master, знак + заставляет произойти толчок, даже если это не приводит к «быстрой перемотке вперед» коммит) ... у вас могут возникнуть проблемы .

Выдержка из этого другого SO вопроса:

Я действительно однажды нажал --force на git.git репозиторий и получил от Линуса БОЛЬШОЕ ВРЕМЯ. Это создаст много проблем для других людей. Простой ответ «не делай этого».

26 голосов
/ 17 октября 2012

В настоящее время git replace может помочь.

Подробно: Создать временную рабочую ветку

git checkout -b temp

Сброс до коммита для замены

git reset --hard <sha1>

Исправить коммит с правильным сообщением

git commit --amend -m "<right message>"

Заменить старый коммит на новый

git replace <old commit sha1> <new commit sha1>

вернитесь в ветку, где вы были

git checkout <branch>

удалить временную ветку

git branch -D temp

толчок

guess

сделано.

17 голосов
/ 29 января 2013

Вы можете использовать git rebase -i (против ветви, с которой вы разветвились) «Я» для интерактивного.

Замените pick рядом с комментарием, который вы хотите изменить, на r (или reword), сохраните и выйдите, и после этого вы сможете выполнить редактирование.

git push еще раз, и все готово!

13 голосов
/ 07 января 2017

Предположим, у вас есть такое дерево:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]

Сначала checkout временная ветвь:

git checkout -b temp

В temp ветви, reset --hard для коммита, для которого вы хотите изменить его сообщение (например, этот коммит 946992):

git reset --hard 946992

Используйте amend, чтобы изменить сообщение:

git commit --amend -m "<new_message>"

После этого дерево будет выглядеть так:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
           \
            b886a0 [temp]

Затем cherry-pick для всех коммитов, которые стоят перед 946992 с master до temp, и используйте их, используйте amend, если вы также хотите изменить их сообщения:

git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>

Дерево теперь выглядит так:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
               \
                b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]

Теперь принудительно нажмите временную ветку на удаленный:

git push --force origin temp:master

Последний шаг: удалить ветку master на локальной, git fetch origin, чтобы извлечь ветку master с сервера, затем переключиться на ветку master и удалить ветку temp.

Теперь и ваши локальные и удаленные будут обновлять все сообщения.

5 голосов
/ 30 мая 2013

В нашем магазине я ввел соглашение о добавлении узнаваемых именованных тегов к коммитам с некорректными сообщениями и использовании аннотации в качестве замены.

Несмотря на то, что это не помогает людям, которые запускают случайные команды «git log», оно дает нам способ исправить неправильные ссылки на средства отслеживания ошибок в комментариях, и все мои инструменты сборки и выпуска понимают соглашение.

Это, очевидно, не общий ответ, но это может быть что-то, что люди могут принять в определенных сообществах. Я уверен, что если это будет использовано в более широком масштабе, то какая-то фарфоровая подставка для него может появиться, в конце концов ...

2 голосов
/ 19 января 2009

http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0)

Как изменить коммиты глубже в истории

Поскольку история в Git неизменна, для исправления чего-либо, кроме самого последнего коммита (коммита, который не является главой ветви), требуется переписать историю с измененного коммита и далее.

Вы можете использовать StGIT для этого, при необходимости инициализировать ветку, отменить передачу до коммита, который вы хотите изменить, всплыть на него, если необходимо, внести изменения, а затем обновить патч (с опцией -e, если вы хотите исправить сообщение коммита) , затем нажмите все и stg commit.

Или вы можете использовать rebase для этого. Создайте новую временную ветвь, перемотайте ее на коммит, который вы хотите изменить, используя git reset --hard, измените этот коммит (это будет верхняя часть текущей главы), затем перебазируйте ветку поверх измененного коммита, используя git rebase --onto.

Или вы можете использовать git rebase --interactive, который допускает различные модификации, такие как переупорядочение патчей, свертывание, ...

Я думаю, что это должно ответить на ваш вопрос. Тем не менее, обратите внимание, что если вы отправили код в удаленный репозиторий и люди извлекли из него данные, то это может испортить их историю кода и ту работу, которую они проделали. Так что делай это осторожно.

...