Случайно отправленный коммит: изменить сообщение git commit - PullRequest
65 голосов
/ 17 февраля 2011

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

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

Теперь удаленное репо (которое являетсяВ GitHub-hosted) тоже есть сообщение о неверной фиксации.

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

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

Ответы [ 4 ]

94 голосов
/ 17 февраля 2011

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

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

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

34 голосов
/ 17 февраля 2011

Вместо того, чтобы пройти весь маршрут перебазирования за один коммит:

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

Вы можете увидеть опции в справочной странице git-reset .

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

6 голосов
/ 15 ноября 2012

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

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

После того, как вы удовлетворены изменениями, используйте мерзавец -f отправить изменения в ваш публичный репо.

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

2 голосов
/ 13 января 2015

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

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

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

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

...