Случайно толкнул фиксации: изменение коммитов в сообщение


в моем локальном РЕПО у меня есть одна фиксация с неправильным сообщением фиксации.

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

теперь удаленное РЕПО (которое размещено на GitHub) также имеет неверное сообщение фиксации.

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

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

4 63

4 ответа:

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

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

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

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

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

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

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

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

git filter-branch -f --msg-filter 'sed "s/<old message>/<new message>/g"' -- --all

для замены сообщения фиксации.

Git создаст временный каталог для перезаписи и дополнительного резервного копирования старых ссылок в refs / original/.

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

-- отделяет параметры ветви фильтра от параметров ревизии

--all убедитесь, что все отделения и теги переопределяются.

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

скажем, вы хотите восстановите свой Мастер и получите доступ к нему в ветке old_master:

git checkout -b old_master refs/original/refs/heads/master

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

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

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

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