Случайное нажатие commit: change git commit message

В моем локальном репо у меня есть одно сообщение с сообщением о некорректной фиксации.

Я уже опубликовал неверное сообщение с сообщением git push.

Теперь удаленное репо (которое размещено в GitHub) также имеет неверное сообщение коммита.

Я уже пробовал git commit --amend, но обнаружил, что это не сработает для меня в этой ситуации, потому что я сделал дополнительные коммиты с неправильной.

Как вы могли бы исправить эту ситуацию?

63
задан jonny 17 февр. '11 в 20:29
источник поделиться
4 ответов

Самое простое решение (, но, пожалуйста, прочитайте весь этот ответ, прежде чем делать это):

  • git rebase -i <hash-of-commit-preceding-the-incorrect-one>
  • В открывшемся редакторе измените pick на reword в строке для неправильной фиксации.
  • Сохраните файл и закройте редактор.
  • Редактор снова откроется с сообщением о некорректной фиксации. Исправьте его.
  • Сохраните файл и закройте редактор.
  • git push --force для обновления GitHub.

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

89
ответ дан Dan Moulding 17 февр. '11 в 20:50
источник поделиться

Вместо того, чтобы идти по всему маршруту переадресации для одного фиксации:

git reset --soft head~
git commit -m "The message you wanted to use"
git push -f

Вы можете увидеть параметры в git-reset manpage.

Для проекта, над которым вы работаете, измененная история не должна быть проблемой.

33
ответ дан Abizern 17 февр. '11 в 21:03
источник поделиться

Если вам нужно изменить старое сообщение фиксации на несколько ветвей (т.е. сообщение с ошибочным сообщением присутствует в нескольких ветвях), вы можете использовать

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 для внесения изменений в ваше публичное репо.

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

5
ответ дан sebers 15 нояб. '12 в 12:46
источник поделиться

Если вы не нажали код на удаленную ветку (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

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

2
ответ дан Packer 13 янв. '15 в 10:08
источник поделиться

Другие вопросы по меткам