Alterando a mensagem de confirmação do git após o envio (dado que ninguém foi retirado do controle remoto)

982

Eu fiz um commit do git e um push subsequente. Gostaria de mudar a mensagem de confirmação. Se eu entendi corretamente, isso não é aconselhável, porque alguém pode ter retirado do repositório remoto antes que eu faça essas alterações. E se eu souber que ninguém puxou?

Existe uma maneira de fazer isso?

K_U
fonte
O que você tentou? Supondo que você já saiba como alterar a mensagem de confirmação e tente enviar, o Git dirá o que você precisa fazer para que isso aconteça.
Andrew Marshall
1
Consulte a resposta à pergunta "Como edito uma mensagem de confirmação incorreta no git (enviei)?" stackoverflow.com/a/457396/444639
Mike Rylander
4
Declarando isso - Google Pergunta sobre git commit Rank no 1!
Manish Shrivastava
Se você alterar o commit HEAD e pressionar normalmente (sem --force), surpreendentemente ele não falha. A mensagem de confirmação HEAD é atualizada com o ID de confirmação alterado. Isso significa que outros IDs de confirmação, exceto HEAD, permanecem intactos. Notei esse comportamento com a versão git 2.8.1.
irsis 13/09/17

Respostas:

1374

Mudando o histórico

Se for o commit mais recente, você pode simplesmente fazer o seguinte:

git commit --amend

Isso exibe o editor com a última mensagem de confirmação e permite editar a mensagem. (Você pode usar -mse quiser apagar a mensagem antiga e usar uma nova.)

Empurrando

E então, quando você pressionar, faça o seguinte:

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

Ou você pode usar "+":

git push <repository> +<branch>

Ou você pode usar --force:

git push --force <repository> <branch>

Tenha cuidado ao usar esses comandos.

  • Se alguém empurrou as alterações para o mesmo ramo, você provavelmente evitará destruí-las. A --force-with-leaseopção é a mais segura, porque será cancelada se houver alguma alteração upstream (

  • Se você não especificar o ramo explicitamente, o Git usará as configurações padrão de envio. Se a configuração padrão de envio for "correspondente", você poderá destruir as alterações em várias ramificações ao mesmo tempo.

Puxar / buscar depois

Qualquer pessoa que já tenha recebido uma mensagem de erro receberá uma atualização e precisará atualizar (assumindo que não está fazendo nenhuma alteração) fazendo algo assim:

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

Tenha cuidado ao usar reset --hard. Se você tiver alterações na ramificação, essas alterações serão destruídas.

Uma observação sobre a modificação do histórico

Os dados destruídos são realmente apenas a mensagem de confirmação antiga, mas --forcenão sabem disso e, com prazer, excluirão outros dados também. Então, pense --forcecomo "Quero destruir dados e sei com certeza que dados estão sendo destruídos". Porém, quando os dados destruídos são confirmados, geralmente é possível recuperar confirmações antigas do reflog - os dados são realmente órfãos em vez de destruídos (embora as confirmações órfãs sejam excluídas periodicamente).

Se você não acha que está destruindo dados, fique longe de --force... coisas ruins podem acontecer .

É por isso que --force-with-leaseé um pouco mais seguro.

Dietrich Epp
fonte
13
Tenha cuidado com essa "correção", como se eles tivessem quaisquer confirmações locais não enviadas, elas serão "perdidas" ( perdidas realmente significando órfãs , mas recuperá-las não é óbvio).
Andrew Marshall
1
você provavelmente deseja especificar o nome da ramificação ao pressionar --force, caso contrário, poderá enviar mais do que o esperado.
user693960
1
@ user693960: O Git enviará apenas o que você configurou.
Dietrich Epp
10
Simplesmente git push --forcesem as opções <repository> e <branch> também funciona, se você tiver configurado o upstream.
ahnbizcad
2
Você pode dar um exemplo de <repository>? É isso origin? org/repo? Ou apenas repo?
MikeSchinkel
440

Apenas diga :

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

e depois

git push --force
Manish Shrivastava
fonte
8
No meu caso git push origin <BRANCH-NAME>não funcionou, tive que usar git push --forcecomo explicado na resposta aceita.
Gabriel
1
isso não funciona para mim. nos tem git push --force, ou então o impulso não passa.
ahnbizcad
4
@ahnbizcad, deve funcionar. Apenas verifique se o nome do ramo está correto.
William
3
Aplaudo a simplicidade da sua explicação! Eu usá-lo mais do que muitas vezes
Vasikos
3
Apliquei esses comandos com êxito somente depois de "desproteger" temporariamente minha ramificação, o que aconteceu no meu projeto hospedado no GitLab. Se você tiver esse problema, antes de aplicar esses comandos, consulte este stackoverflow.com/a/32267118/1423345 para "desproteger" a ramificação e você poderá "protegê-la" novamente após concluir a alteração da mensagem de confirmação :)
John
262

Para editar uma confirmação diferente da mais recente:

Etapa 1 : git rebase -i HEAD~nrealizar uma nova rebarba interativa para os últimos ncommit afetados. (ou seja, se você deseja alterar uma mensagem de confirmação 3 confirmada, faça git rebase -i HEAD~3)

O git abrirá um editor para lidar com esses commits, observe este comando:

#  r, reword = use commit, but edit the commit message

é exatamente isso que precisamos!

Passo 2 : Mudar pickpara rpara aqueles commits que você deseja atualizar a mensagem. Não se preocupe em alterar a mensagem de confirmação aqui, ela será ignorada. Você fará isso no próximo passo. Salve e feche o editor.

Observe que, se você editar o seu plano de rebase, ele ainda não iniciará o processo de renomear os arquivos, execute:

git rebase --continue

Se você deseja alterar o editor de texto usado para a sessão interativa (por exemplo, do padrão vi para nano), execute:

GIT_EDITOR=nano git rebase -i HEAD~n

Etapa 3 : O Git abrirá outro editor para todas as revisões que você colocou rantes. Atualize a mensagem de confirmação como desejar e salve e feche o editor.

Etapa 4 : Depois que todas as confirmações, as mensagens são atualizadas. você pode querer fazer git push -fpara atualizar o controle remoto.

Jinsong Li
fonte
21
Essa resposta deve ser aceita, pois oferece a possibilidade de alterar outros commit além do commit mais recente, diferentemente da resposta aceita. Você salvou meu dia. Obrigado!
XZero
1
Escolha n = 3 para os últimos 3 commits:git rebase -i HEAD~3
HeikoS
Se você editar seu plano de rebase ainda assim não iniciar o processo de renomear os arquivos, execute git rebase --continue. E se você deseja alterar o editor de texto usado para a sessão interativa (por exemplo, do padrão vipara nano), execute GIT_EDITOR=nano git rebase -i HEAD~n.
Jamie Birch
Eu editei isso para adicionar um pouco mais de informação. Por favor dê uma olhada. Esta foi a resposta para o que eu queria fazer, mas rolei por ela porque não tinha o cabeçalho.
Kip
Fiz uma edição sugerida para colocar o comentário útil de @JamieBirch na resposta, que talvez você queira revisar.
Notts90 suporta Monica
44

Use estas duas etapas no console:

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

e depois

git push -f

Feito :)

Abdul Rizwan
fonte
Thx, essas etapas são apenas para alterar o último comentário ou também podem ser usadas para comentários mais antigos?
Jay em Jay
@ Jay desculpe pela resposta tardia, estas etapas apenas para alterar a última mensagem de confirmação.
Abdul Rizwan
19

Deve-se notar que, se você usar push --forcecom várias referências, todas elas serão modificadas como resultado. Certifique-se de prestar atenção para onde seu repositório git está configurado para enviar. Felizmente, existe uma maneira de proteger um pouco o processo, especificando uma única ramificação para atualizar. Leia as páginas de manual do git:

Observe que --force se aplica a todas as referências que são enviadas por push, portanto, utilizá-la com push.default definido como correspondente ou com vários destinos de envio configurados com remote. *. Push pode substituir referências que não sejam a ramificação atual (incluindo referências locais que são estritamente atrás do seu homólogo remoto). Para forçar um push em apenas um ramo, use um + na frente do refspec para fazer o push (por exemplo, git push origin + master para forçar um push no ramo mestre).

Steve Benner
fonte
3
Nota muito importante.
peterh - Restabelece Monica
nenhuma das respostas forçadas funciona para mim, porque não tenho permissões do ForcePush no servidor. Em vez disso, quero executar uma confirmação que altera uma mensagem de confirmação anterior. Eu poderia escrever "mensagem de confirmação alterada" na seção de comentários dessa confirmação.
Nurettin
11

Se você deseja modificar um mais antigo commit, não o último, você precisará usar rebaseo comando como explicado aqui, Github página de ajuda , no rectificativo a mensagem da mais velha ou múltipla cometer mensagens secção

Carlos
fonte
11

Comando 1 .

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

Então,

Comando 2 .

git push origin --force
Teo Choong Ping
fonte
8
git commit --amend

edite e altere a mensagem na janela atual. Depois disso

git push --force-with-lease
Beu
fonte
2

Outra opção é criar uma "confirmação de errata" adicional (e push) que faça referência ao objeto de confirmação que contém o erro - a nova confirmação de errata também fornece a correção. Uma confirmação de errata é uma confirmação sem alterações substanciais no código, mas com uma mensagem importante de confirmação - por exemplo, adicione um caractere de espaço ao seu arquivo leia-me e confirme essa alteração com a importante mensagem de confirmação ou use a opção git --allow-empty. É certamente mais fácil e seguro do que refazer o processo, não modifica o histórico verdadeiro e mantém a árvore do ramo limpa (usandoamendtambém é uma boa opção se você estiver corrigindo a confirmação mais recente, mas uma confirmação de errata pode ser uma boa opção para confirmações mais antigas). Esse tipo de coisa ocorre tão raramente que simplesmente documentar o erro é bom o suficiente. No futuro, se você precisar pesquisar em um log git uma palavra-chave de recurso, a confirmação original (incorreta) poderá não aparecer porque a palavra-chave errada foi usada nessa confirmação original (o erro de digitação original) - no entanto, a palavra-chave aparecerá na confirmação da errata, que apontará para o commit original que teve o erro de digitação. Aqui está um exemplo:

$ git log
confirmar 0c28141c68adae276840f17ccd4766542c33cf1d
Autor: Primeiro Último 
Data: quarta-feira, 8 de agosto de 15:55:52 2018 -0600

    Confirmação de errata:
    Este commit não possui alterações substanciais no código.
    Essa confirmação é fornecida apenas para documentar uma correção em uma mensagem de confirmação anterior.
    Isso pertence ao objeto de confirmação e083a7abd8deb5776cb304fa13731a4182a24be1
    Mensagem de confirmação incorreta original:
        Cor do plano de fundo alterada para vermelho
    Correção (* alteração destacada *):
        Cor do plano de fundo alterada para * azul *

confirmar 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Autor: Primeiro Último 
Data: Wed 8 de agosto 15:43:16 2018 -0600

    Alguma mensagem de confirmação provisória

confirmar e083a7abd8deb5776cb304fa13731a4182a24be1
Autor: Primeiro Último 
Data: Wed 8 de agosto 13:31:32 2018 -0600

    Cor do plano de fundo alterada para vermelho
rob_7cc
fonte
Rob, isso parece promissor. você pode mostrar os comandos necessários para executar uma "confirmação de errata". somente esta postagem aparece no google nesses termos.
Jim
1
Uma "confirmação de errata" é simplesmente uma confirmação normal com uma mensagem que faz referência à confirmação incorreta anterior, documentando e fornecendo uma correção para o erro anterior. git commit -m “fixed feature A”(Vamos supor que o git dê a ele um ID de confirmação do e3ab7312 ... ... (mais tarde você perceberá que sua mensagem estava incorreta, faça uma alteração inconseqüente em um arquivo, como adicionar um espaço ao arquivo leia-me ou use a —allow-emptyopção git). .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc 11/08/18
1
... se você precisar pesquisar mais tarde no log git por referências ao "recurso B", a confirmação da errata será exibida, mas a mensagem de confirmação da errata conterá uma referência ao ID da confirmação original que fornece rastreabilidade total. Entre o termo “errata commit” não é nada de especial (não há comando “errata” nem opção no git) ... é apenas a minha terminologia para um commit normal que fornece uma correção para um commit anterior que teve um erro / erro de digitação.
rob_7cc
Rob, isso funcionou muito bem. Consegui adicionar um novo commit vazio com a descrição correta, que aponta para o commit original, usando o SHA. agora, ambos são mostrados na minha 'cadeia git' para os módulos. obrigado!
Jim Jim
Estou feliz que funcionou para você. Eu uso a mesma técnica para corrigir erros nas mensagens de confirmação. Como alternativa, eu descobri recentemente que git notes isso serviria ao mesmo propósito que um "commit de errata". Basta adicionar uma nota a um commit anterior para anotar ou corrigir eventuais erros na mensagem de commit: https://git-scm.com/docs/git-notes
rob_7cc
0

Isso funciona para mim muito bem,

origem / nome da filial do git checkout

se você já está no ramo, é melhor puxar ou refazer

git pull

ou

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

Mais tarde você pode simplesmente usar

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

ou se você deseja abrir o editor de texto, use

git commit --amend

Eu prefiro usar o editor de texto se você tiver muitos comentários. Você pode definir seu editor de texto preferido com o comando

git config --global core.editor your_preffered_editor_here

De qualquer forma, quando terminar de alterar a mensagem de confirmação, salve-a e saia

e depois corra

git push --force

E você terminou

Hasasn
fonte
0

informações adicionais para o mesmo problema se você estiver usando o pipeline de bitbucket

edite sua mensagem

git commit --amend

empurrar para o sever

git push --force <repository> <branch>

adicione --force ao seu comando push no pipeline

git ftp push --force

Isso excluirá o (s) seu (s) commit (s) anterior (es) e enviará o seu atual.

remova o --force após o primeiro empurrão

eu tentei no pipeline de bitbucket e está funcionando bem

Abdallah Awwad Alkhwaldah
fonte