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

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

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

Ответ 1

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

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

git commit --amend

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

Нажатие

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

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 несколько безопаснее.

Ответ 2

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

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

а затем

git push --force

Ответ 3

Чтобы изменить коммит, отличный от самого последнего:

Шаг 1: git rebase -i HEAD~n для интерактивного перебазирования для последних затронутых коммитов n. (то есть, если вы хотите изменить сообщение о коммите 3, сделайте назад, сделайте git rebase -i HEAD~3)

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

Шаг2: Измените pick на r для тех коммитов, которые вы хотите обновить. Не беспокойтесь об изменении сообщения коммита здесь, оно будет проигнорировано. Вы сделаете это на следующем шаге. Сохраните и закройте редактор.

Шаг 3: Git будет открывать другой редактор для каждой ревизии, которую вы поместили r ранее. Обновите сообщение, как вам нравится, затем сохраните и закройте редактор.

Шаг 4: после всех коммитов сообщения обновляются. Вы можете сделать git push -f, чтобы обновить пульт.

Ответ 4

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

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

, а затем

git push -f

Готово:)

Ответ 5

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

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

Ответ 6

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

Ответ 7

Команда 1.

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

Затем

Команда 2.

git push origin --force

Ответ 8

git commit --amend

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

git push --force-with-lease

Ответ 9

Другой вариант - создать дополнительную "фиксацию ошибок" (и 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

Ответ 10

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

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

И вы закончили

Ответ 11

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

отредактируйте ваше сообщение

git commit --amend

подтолкнуть к разрыву

git push --force <repository> <branch>

затем добавьте --force к вашей команде push на конвейере

git ftp push --force

Это удалит ваш предыдущий коммит и подтолкнет ваш текущий.

удалить --force после первого нажатия

я попробовал это на конвейере bitbucket и он работает нормально