Случайное нажатие commit: change git commit message
В моем локальном репо у меня есть одно сообщение с сообщением о некорректной фиксации.
Я уже опубликовал неверное сообщение с сообщением git push
.
Теперь удаленное репо (которое размещено в GitHub) также имеет неверное сообщение коммита.
Я уже пробовал git commit --amend
, но обнаружил, что это не сработает для меня в этой ситуации, потому что я сделал дополнительные коммиты с неправильной.
Как вы могли бы исправить эту ситуацию?
Ответы
Ответ 1
Самое простое решение (, но, пожалуйста, прочитайте весь этот ответ, прежде чем делать это):
-
git rebase -i <hash-of-commit-preceding-the-incorrect-one>
- В открывшемся редакторе измените
pick
на reword
в строке для неправильной фиксации.
- Сохраните файл и закройте редактор.
- Редактор снова откроется с сообщением о некорректной фиксации. Исправьте его.
- Сохраните файл и закройте редактор.
-
git push --force
для обновления GitHub.
Это означает, что вы будете публиковать измененную версию ранее опубликованного репозитория. Если кто-то вытащил или вытащил из вашего репо между вами, когда вы допустили ошибку с неправильным сообщением о совершении, и когда вы его исправили, тогда они испытают некоторые трудности позже. Поэтому убедитесь, что вы можете принять это последствие, прежде чем пытаться это сделать.
Ответ 2
Вместо того, чтобы идти по всему маршруту переадресации для одного фиксации:
git reset --soft head~
git commit -m "The message you wanted to use"
git push -f
Вы можете увидеть параметры в git-reset manpage.
Для проекта, над которым вы работаете, измененная история не должна быть проблемой.
Ответ 3
Если вам нужно изменить старое сообщение фиксации на несколько ветвей (т.е. сообщение с ошибочным сообщением присутствует в нескольких ветвях), вы можете использовать
git filter-branch -f --msg-filter 'sed "s/<old message>/<new message>/g"' -- --all
чтобы заменить сообщение фиксации.
Git создаст временный каталог для перезаписи и дополнительно резервное копирование старых ссылок в refs/original/.
-f
обеспечит выполнение операции. Это необходимо, если временная директория уже присутствует или имеются уже ссылки, хранящиеся в файле refs/original. Если это не так, вы можете сбросить этот флаг.
--
отделяет опции ветвления фильтра от параметров версии
--all
будет гарантировать, что все ветки и теги будут перезаписаны.
Из-за резервного копирования ваших старых ссылок вы можете легко вернуться к состоянию перед выполнением команды.
Скажем, вы хотите восстановить свой мастер и получить доступ к нему в ветке old_master:
git checkout -b old_master refs/original/refs/heads/master
После того, как вы удовлетворены своими изменениями, используйте git push -f
для внесения изменений в ваше публичное репо.
Обратите внимание, что вы должны сообщить об этом сотрудникам, поскольку все хэши коммитов, начинающиеся с первого измененного, были изменены.
Ответ 4
Если вы не нажали код на удаленную ветку (Github/Bitbucket), вы можете изменить сообщение фиксации в командной строке, как показано ниже.
git commit --amend -m "Your new message"
Если вы работаете над определенной веткой, сделайте это.
git commit --amend -m "BRANCH-NAME: new message"
Если вы уже нажали на код с неправильным сообщением, вам нужно быть осторожным при изменении сообщения. после того как вы измените сообщение фиксации и попробуйте снова нажать его, у вас возникнут проблемы. Чтобы сделать его гладким, выполните следующие действия.
Пожалуйста, прочитайте весь ответ, прежде чем делать это
git commit --amend -m "BRANCH-NAME : your new message"
git push -f origin BRANCH-NAME # Not a best practice. Read below why?
Важное примечание:. Когда вы используете принудительное нажатие, вы можете столкнуться с проблемами кода, которые другие разработчики работают над одной ветвью. Поэтому, чтобы избежать конфликтов, вам нужно вытащить код из своей ветки, прежде чем нажимать force
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
Это наилучшая практика при изменении сообщения фиксации, если оно уже было нажато.