Изменение сообщения git commit после push (учитывая, что никто не вытащил с пульта) - PullRequest
860 голосов
/ 24 января 2012

Я сделал git commit и последующий push. Я хотел бы изменить сообщение коммита. Если я правильно понимаю, это не рекомендуется, потому что кто-то мог вытащить из удаленного хранилища, прежде чем я внесу такие изменения. Что если я знаю, что никто не потянул?

Есть ли способ сделать это?

Ответы [ 11 ]

1227 голосов
/ 24 января 2012

История изменений

Если это самый последний коммит, вы можете просто сделать это:

git commit --amend

Это вызовет редактор с последним сообщением коммита и позволит вам отредактировать сообщение,(Вы можете использовать -m, если хотите стереть старое сообщение и использовать новое.)

Pushing

А затем, когда вы нажимаете, сделайте следующее:

git push --force-with-lease <repository> <branch>

Или вы можете использовать «+»:

git push <repository> +<branch>

Или вы можете использовать --force:

git push --force <repository> <branch>

Будьте осторожны при использовании этих команд.

  • Если кто-то еще отправил изменения в ту же ветку, вы, вероятно, захотите избежать уничтожения этих изменений.Опция --force-with-lease является самой безопасной, потому что она прервется, если будут какие-либо изменения в восходящем направлении (

  • Если вы не укажете ветвь явно, Git будет использовать настройки push по умолчанию.Если заданная по умолчанию настройка подталкивания «совпадает», то вы можете уничтожить изменения в нескольких ветвях одновременно.

Извлечение / извлечение впоследствии

Любой, кто уже вытянул, будетТеперь получите сообщение об ошибке, и они должны будут обновить (при условии, что они не вносят никаких изменений самостоятельно), выполнив что-то вроде этого:

git fetch origin
git reset --hard origin/master # Loses local commits

Будьте осторожны при использовании reset --hard. Если у вас есть изменениядля ветви эти изменения будут уничтожены.

Замечание об изменении истории

Уничтоженные данные - это просто старое сообщение о коммите, но --force не знает об этом и будетудачно удаляйте и другие данные. Поэтому думайте о --force как о «Я хочу уничтожить данные, и я точно знаю, какие данные уничтожаются». Но когда уничтоженные данные фиксируются, вы часто можетевосстановить старые коммиты из reflog - данные на самом деле осиротели вместо уничтоженных (хотя осиротевшие коммиты периодически удаляются).

Если вы не думаете, что уничтожаете данные, оставайтесьподальше от --force ... могут случиться плохие вещи .

Вот почему --force-with-lease несколько безопаснее.

386 голосов
/ 31 декабря 2013

Просто скажите:

git commit --amend -m "New commit message"

, а затем

git push --force
201 голосов
/ 01 февраля 2017

Возможно, опоздал на вечеринку, вот ответ, которого я здесь не вижу.

Step1 : git rebase -i HEAD~n для интерактивного перебазирования за последние затронутые коммиты n.

git откроет редактор для обработки этих коммитов, обратите внимание на эту команду: # r, reword = use commit, but edit the commit message, это именно то, что нам нужно.

Step2 : измените pick на r для тех коммитов, которые вы хотите обновить. Сохраните и закройте редактор.

Step3 : в следующих файлах коммитов обновите сообщение о коммите, как вам нравится

Step4 : после обновления сообщений все коммиты обновляются. Вы можете сделать git push -f для обновления пульта.

39 голосов
/ 19 июня 2017

Используйте эти два шага в консоли:

git commit --amend -m "new commit message"

, а затем

git push -f

Готово:)

18 голосов
/ 24 марта 2014

Следует отметить, что , если вы используете push --force с множественными ссылками, они ВСЕ будут изменены в результате. Обязательно обратите внимание на то, где сконфигурировано ваше git-репо.К счастью, есть способ немного защитить процесс, указав одну ветвь для обновления.Прочтите справочные страницы git:

Обратите внимание, что --force применяется ко всем отправляемым ссылкам, поэтому используется с push.default, настроенным на совпадение, или с несколькими получателями, настроенными для удаленного доступа. *.push может перезаписывать ссылки, отличные от текущей ветки (включая локальные ссылки, которые строго находятся за их удаленным аналогом).Для того, чтобы заставить толчок только одной ветви, используйте + в передней части refspec нажать (например, мерзавец толчок происхождения + мастер, чтобы заставить толчок к главной ветви).

1008 *
11 голосов
/ 28 октября 2016

Если вы хотите изменить более старую фиксацию, а не последнюю, вам нужно будет использовать команду rebase, как описано здесь, Страница справки Github , на Исправление сообщения старые или сообщения с несколькими коммитами раздел

9 голосов
/ 18 апреля 2017

Команда 1 .

git commit --amend -m "New and correct message"

Тогда

Команда 2 .

git push origin --force
3 голосов
/ 05 января 2018
git commit --amend

, затем отредактируйте и измените сообщение в текущем окне.После этого выполните

git push --force-with-lease
2 голосов
/ 09 августа 2018

Другой вариант - создать дополнительную «фиксацию ошибок» (и push), которая ссылается на объект фиксации, содержащий ошибку - новая фиксация ошибок также обеспечивает исправление. Ошибочная фиксация - это фиксация без существенных изменений кода, но с важным сообщением фиксации - например, добавьте один пробел в ваш файл readme и подтвердите это изменение с помощью важного сообщения фиксации или используйте параметр git --allow-empty. Это, безусловно, проще и безопаснее, чем перебазирование, оно не изменяет истинную историю и поддерживает чистоту дерева ветвей (использование amend также является хорошим выбором, если вы исправляете самый последний коммит, но ошибочный коммит может быть хорошим выбор для более старых коммитов). Этот тип вещей случается так редко, что достаточно просто документировать ошибку. В будущем, если вам потребуется выполнить поиск в журнале git по ключевому слову функции, оригинальная (ошибочная) фиксация может не появиться, поскольку в этой оригинальной фиксации использовалось неправильное ключевое слово (оригинальная опечатка) - однако ключевое слово появится в сообщении об ошибке, которое затем укажет вам исходный коммит с опечаткой. Вот пример:

$ git log
commit 0c28141c68adae276840f17ccd4766542c33cf1d
Author: First Last 
Date:   Wed Aug 8 15:55:52 2018 -0600

    Errata commit:
    This commit has no substantive code change.
    This commit is provided only to document a correction to a previous commit message.
    This pertains to commit object e083a7abd8deb5776cb304fa13731a4182a24be1
    Original incorrect commit message:
        Changed background color to red
    Correction (*change highlighted*):
        Changed background color to *blue*

commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Author: First Last 
Date:   Wed Aug 8 15:43:16 2018 -0600

    Some interim commit message

commit e083a7abd8deb5776cb304fa13731a4182a24be1
Author: First Last 
Date:   Wed Aug 8 13:31:32 2018 -0600

    Changed background color to red
1 голос
/ 12 мая 2017

Это работает для меня довольно хорошо,

git checkout origin / branchname

если вы уже в ветке, то лучше сделать pull или rebase

git pull

или

git -c core.quotepath=false fetch origin --progress --prune

Позже вы можете просто использовать

git commit --amend -m "Your message here"

или если вы хотите открыть текстовый редактор, используйте

git commit --amend

Я бы предпочел использовать текстовый редактор, если у вас много комментариев. Вы можете установить предпочитаемый текстовый редактор с помощью команды

git config --global core.editor your_preffered_editor_here

В любом случае, когда вы закончите изменять сообщение фиксации, сохраните его и выйдите из

и затем запустить

git push --force

И все готово

...