Я хочу изменить сообщение коммита глубже в истории, и я выдвинул много новых коммитов.
Как мне изменить сообщение коммита? Является ли это возможным?
Я хочу изменить сообщение коммита глубже в истории, и я выдвинул много новых коммитов.
Как мне изменить сообщение коммита? Является ли это возможным?
Ответы:
Сообщение от Линуса Торвальдса может ответить на ваш вопрос:
Изменить / отредактировать старые сообщения коммита
Краткий ответ: нельзя (если нажал).
выдержка (Линус называет BitKeeper как BK):
Заметка, просто из исторического интереса: в БК можно.
И если вы привыкли к этому (как я), это было действительно довольно практично. Я бы применил патч-бомбу от Эндрю, заметил, что что-то не так, и просто отредактировал ее, прежде чем выдвинуть.
Я мог бы сделать то же самое с мерзавцем. Было бы достаточно легко сделать так, чтобы просто сообщение о фиксации не было частью имени, и при этом гарантировалось, что история осталась нетронутой, и позволяло «исправить комментарии позже».
Но я не сделал.
Частично это чисто «внутренняя согласованность». Git - просто более чистая система, поскольку все защищено SHA1, и все объекты обрабатываются одинаково, независимо от типа объекта. Да, есть четыре разных типа объектов, и все они действительно разные, и их нельзя использовать одинаково, но в то же время, даже если их кодировка на диске может быть разной, концептуально все они работают точно тот же самый.
Но внутренняя согласованность не является оправданием негибкости, и, очевидно, было бы очень гибко, если бы мы могли просто исправлять ошибки после их возникновения. Так что это не очень сильный аргумент.
Реальная причина мерзавец не позволяет изменять фиксации концов сообщения до будучи очень просто: таким образом, вы можете доверять сообщениям. Если вы позволили людям изменить их впоследствии, сообщения по своей сути не очень заслуживают доверия.
Чтобы быть полным, вы можете переписать свою локальную историю коммитов, чтобы отразить то, что вы хотите, как предлагает sykora (с некоторой перебазировкой и сбросом --hard, gasp!)
Однако, как только вы опубликовать пересмотренную историю снова (с git push origin +master:master
, то +
знак заставляя толчок произойти, даже если это не приводит к «быстрому вперед» совершить) ... вы могли бы попасть в неприятность .
Выдержка из этого другого ТАК вопроса:
Я на самом деле однажды нажал --force на git.git репозиторий и получил от Линуса БОЛЬШОЕ ВРЕМЯ. Это создаст много проблем для других людей. Простой ответ «не делай этого».
В настоящее время 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
сделано.
Вы можете использовать git rebase -i
(против ответвления, от которого вы разветвились) «i» для интерактива.
Замените pick
следующий за комментарием фиксации, который вы хотите изменить, r
(или reword
), сохраните и выйдите, и после этого вы сможете выполнить редактирование.
git push
еще раз и все готово!
-p
аргумент о том, rebase
какие p
резервы сливаются.
Предположим, у вас есть такое дерево:
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
.
Теперь и ваши локальные и удаленные будут обновлять все сообщения.
В нашем магазине я ввел соглашение о добавлении узнаваемых именованных тегов к коммитам с некорректными сообщениями и использовании аннотации в качестве замены.
Несмотря на то, что это не помогает людям, которые запускают случайные команды «git log», оно дает нам возможность исправить неправильные ссылки на средства отслеживания ошибок в комментариях, и все мои инструменты сборки и выпуска понимают соглашение.
Это, очевидно, не общий ответ, но это может быть что-то, что люди могут принять в конкретных сообществах. Я уверен, что если это будет использоваться в более широком масштабе, то какая-то фарфоровая подставка для него может в конечном итоге возникнуть ...
(Из http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 )
Как изменить коммиты глубже в истории
Поскольку история в Git неизменна, для исправления чего-либо, кроме самого последнего коммита (коммит, который не является заголовком ветви), требуется переписать историю с измененного коммита и далее.
Для этого вы можете использовать StGIT, при необходимости инициализировать ветвь, отменить передачу до коммита, который вы хотите изменить, всплыть на него, если необходимо, внести изменения, затем обновить патч (с опцией -e, если вы хотите исправить сообщение коммита), затем нажать все и stg совершают.
Или вы можете использовать rebase, чтобы сделать это. Создайте новую временную ветвь, перемотайте ее на коммит, который вы хотите изменить, с помощью git reset --hard, измените этот коммит (это будет верхняя часть текущей главы), затем перебазируйте ветку поверх измененного коммита, используя git rebase --onto.
Или вы можете использовать git rebase --interactive, который допускает различные модификации, такие как переупорядочение патчей, свертывание, ...
Я думаю, что должен ответить на ваш вопрос. Однако обратите внимание, что если вы отправили код в удаленный репозиторий, а люди извлекли его из него, то это испортит их историю кода, а также работу, которую они проделали. Так что делай это осторожно.