Случайное нажатие 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

Это наилучшая практика при изменении сообщения фиксации, если оно уже было нажато.