Как изменить неверное сообщение фиксации в git (что я нажал)?

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

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

Ответ 1

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

Изменить/редактировать старые сообщения фиксации

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


extract (Linus относится к BitKeeper как BK):

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

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

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

Но я этого не делал.

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

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

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


Чтобы быть полным, вы можете переписать свою локальную историю фиксации, чтобы отразить то, что вы хотите, как предложенное sykora (с некоторыми rebase и reset - тяжело, вздох!)

Однако, как только вы снова публикуете свою пересмотренную историю (с символом git push origin +master:master, знак +, заставляющий нажать, даже если это не приводит к фиксации "быстрой перемотки вперед" )... вы может столкнуться с некоторыми проблемами.

Извлеките этот другой вопрос SO:

Я на самом деле однажды нажал с -force в репозиторий git.git и получил ругательство Linus BIG TIME. Это создаст массу проблем для других людей. Простой ответ: "Не делай этого".

Ответ 2

В настоящее время git replace может сделать трюк.

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

git checkout -b temp

Reset для фиксации для замены

git reset --hard <sha1>

Изменить фиксацию с помощью правильного сообщения

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

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

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

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

git checkout <branch>

удалить ветвь temp

git branch -D temp

толчок

guess

сделано.

Ответ 3

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

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

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

Ответ 4

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

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

Во-первых, checkout временная ветка:

git checkout -b temp

В ветке temp, reset --hard для фиксации, которую вы хотите изменить для своего сообщения (например, это commit 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]

Теперь задвиньте ветвь temp на пульте дистанционного управления:

git push --force origin temp:master

На последнем этапе удалите ветку master на локальном, git fetch origin, чтобы удалить ветвь master с сервера, затем переключитесь на ветвь master и удалите ветвь temp.

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

Если вы используете Git Extensions: перейдите на экран "Фиксация", в нижней части должен быть флажок "Изменить коммит", как показано ниже:

enter image description here