Como modificar mensagens de confirmação existentes e não enviadas?

7664

Eu escrevi a coisa errada em uma mensagem de confirmação.

Como posso mudar a mensagem? A confirmação ainda não foi enviada.

Laurie Young
fonte
868
Para os novatos no assunto: o argumento de Laurie sobre não ter pressionado ainda é importante. Como rebasear, isso está mudando a história. Se alguém tiver clonado / retirado do seu repositório entre o histórico original e o reescrito, ele não será capaz de puxar após a reescrita (para esse ramo).
Pat Notz 10/10/08

Respostas:

16132

Alterando a mensagem de confirmação mais recente

git commit --amend

abrirá seu editor, permitindo que você altere a mensagem de confirmação da confirmação mais recente. Além disso, você pode definir a mensagem de confirmação diretamente na linha de comando com:

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

… No entanto, isso pode tornar as mensagens de confirmação de várias linhas ou pequenas correções mais difíceis de inserir.

Certifique-se de não ter nenhuma alteração nas cópias de trabalho preparada antes de fazer isso ou elas serão confirmadas também. ( As alterações não faseadas não serão confirmadas.)

Alterando a mensagem de uma confirmação que você já enviou para sua filial remota

Se você já enviou seu commit até sua ramificação remota, depois de alterar o commit localmente (como descrito acima), também precisará forçar o push com:

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

Aviso: pressionar com força substituirá a ramificação remota pelo estado da sua ramificação local . Se houver commits no ramo remoto que você não tem em sua filial local, você vai perder os commits.

Aviso: tenha cuidado ao alterar confirmações que você já compartilhou com outras pessoas. As confirmações de alteração basicamente as reescrevem para ter IDs SHA diferentes , o que representa um problema se outras pessoas tiverem cópias da confirmação antiga que você reescreveu. Qualquer pessoa que possua uma cópia do commit antigo precisará sincronizar seu trabalho com o commit recém-reescrito, o que às vezes pode ser difícil; portanto, coordene-se com outras pessoas ao tentar reescrever o histórico de commit compartilhado ou evite reescrever commits compartilhados completamente.


Realizar uma nova análise interativa

Outra opção é usar o rebase interativo. Isso permite editar qualquer mensagem que você queira atualizar, mesmo que não seja a mensagem mais recente.

Para fazer uma abóbora Git, siga estas etapas:

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

Depois de compactar seus commits - escolha o e/rpara editar a mensagem:

Digite a descrição da imagem aqui

Nota importante sobre o rebase interativo

Quando você usa git rebase -i HEAD~n, pode haver mais de n confirmações. O Git "coletará" todos os commits nos últimos n commits e, se houver uma mesclagem em algum lugar nesse intervalo, você também verá todos os commits, portanto o resultado será n +.

Boa dica:

Se você precisar fazer isso por mais de um único ramo e poderá enfrentar conflitos ao alterar o conteúdo, configure git rereree deixe o Git resolver esses conflitos automaticamente para você.


Documentação

user456814
fonte
257
No entanto, git commit --amendnão é tão poderoso quanto git rebase -i.
Jeffrey Jose
76
@jeffjose, definitivamente não precisa ser. Além disso, git commit --amendpode corrigir o commit mestre (a?).
Strager
116
Se você já empurrou, apenas forçar impulso novamente:git push -f origin branchname
Hughes
177
@ hughes não é git push -fum pouco perigoso se outras pessoas estiverem usando o mesmo repositório?
Armand #
91
Se você não deseja reescrever a mensagem de confirmação inteira, vá para git commit --amend -c HEAD. Isso abrirá o editor pré-preenchido com sua antiga mensagem de confirmação, para que você possa alterá-la.
Sam
2506
git commit --amend -m "your new message"
lfx_cool
fonte
7
Eu fiz o git commit --amend -m "Nova mensagem", mas enviar para o Github gerou o "Mesclar as alterações remotas antes de enviar novamente". Após puxar, confirmar --amend e pressionar novamente, a nova mensagem não aparece. Em vez disso, tenho "Mesclar ramo 'mestre' do github.com:[myrepo]"
Dave Everitt
8
@DaveEveritt, você provavelmente enviou seu commit antes da tentativa de corrigi-lo.
Thorbjørn Ravn Andersen
12
@Kyralessa não é verdade. No bash, você pode facilmente compor mensagens de confirmação de várias linhas, apenas não fechando a cotação até terminar (pressionando retorno no final de cada linha entre aspas).
Placas
32
Não entendo como uma resposta se parece muito com a idéia principal de uma resposta que foi escrita há dois anos e também a resposta aceita recebe muitos votos. Estranho. (nada de errado com a resposta)
happy coder
7
@AmalMurali, bem. Meu ponto não era tanto a popularidade da pergunta, nem a utilidade da resposta. Mas essa resposta em particular não é a resposta mais antiga, nem oferece mais informações sobre a resposta aceita. Parece ser uma cópia de uma seção da resposta aceita. Esse foi o meu ponto. FELICIDADES!
Codificador happy
2376

Se o commit que você deseja corrigir não for o mais recente:

  1. git rebase --interactive $parent_of_flawed_commit

    Se você deseja corrigir vários commits defeituosos, passe o pai do mais antigo deles.

  2. Um editor será exibido, com uma lista de todos os commit desde o que você forneceu.

    1. Altere pickpara reword(ou nas versões antigas do Git, para edit) na frente de quaisquer confirmações que você deseja corrigir.
    2. Depois de salvar, o Git repetirá os commits listados.

  3. Para cada confirmação que você deseja reformular , o Git o levará de volta ao seu editor. Para cada confirmação que você deseja editar , o Git coloca você no shell. Se você estiver na concha:

    1. Altere o commit da maneira que desejar.
    2. git commit --amend
    3. git rebase --continue

A maior parte dessa sequência será explicada a você pela saída dos vários comandos à medida que você avança. É muito fácil; você não precisa memorizá-lo - lembre-se de que git rebase --interactivepermite corrigir confirmações, não importa quanto tempo elas foram.


Observe que você não desejará alterar confirmações que você já enviou. Ou talvez sim, mas, nesse caso, você terá que tomar muito cuidado para se comunicar com todos que possam ter retirado seus commits e feito um trabalho em cima deles. Como recuperar / ressincronizar depois que alguém envia uma rebase ou redefinição para uma ramificação publicada?

Aristóteles Pagaltzis
fonte
39
Pode-se alterar a mensagem do primeiro commit (que não possui um pai)?
13ren
27
Isso é mencionado em uma das outras respostas, mas vou colocar uma nota aqui. Desde o git 1.6.6, você pode usar rewordno lugar de pickpara editar a mensagem de log.
MitMaro
89
Aliás, $parent_of_flawed_commité equivalente a $flawed_commit^.
Peeja
67
NUNCA faça isso (ou faça uma nova recuperação em geral) se você já fez o upstream!
Daniel Rinser
20
Use -p( --preserve-merges) se houver uma mesclagem após o commit defeituoso.
ahven 31/01
778

Para alterar a confirmação anterior, faça as alterações desejadas e encene essas alterações e, em seguida, execute

git commit --amend

Isso abrirá um arquivo no seu editor de texto representando sua nova mensagem de confirmação. Ele começa preenchido com o texto da sua antiga mensagem de confirmação. Altere a mensagem de confirmação como desejar, salve o arquivo e feche o editor para concluir.

Para alterar a confirmação anterior e manter a mesma mensagem de log, execute

git commit --amend -C HEAD

Para corrigir a consolidação anterior removendo-a completamente, execute

git reset --hard HEAD^

Se você deseja editar mais de uma mensagem de confirmação, execute

git rebase -i HEAD~commit_count

(Substitua commit_count pelo número de confirmações que você deseja editar.) Este comando inicia seu editor. Marque o primeiro commit (o que você deseja alterar) como "edit" em vez de "pick" e salve e saia do seu editor. Faça a alteração que deseja confirmar e depois execute

git commit --amend
git rebase --continue

Nota: Você também pode "Fazer a alteração desejada" no editor aberto por git commit --amend

Fatih Acet
fonte
18
git rebase -i HEAD~commit_counttambém permitirá que você altere as mensagens de confirmação de quantas confirmações você escolher. Apenas marque os commits escolhidos como "reformular" em vez de "selecionar".
21413 Joe
2
E se você não quiser se recuperar? Você só quer mudar uma mensagem antiga?
SuperUberDuper
3
git reset --hardaniquila alterações não confirmadas. Substitua --hardpor --soft.
enguia ghEEz
1
Concordado, git reset --hardé um comando perfeitamente legítimo, mas é enganoso dada a pergunta. Você usa --hardse tiver confirmado alterações que deseja jogar fora, não se tiver digitado um erro de digitação na mensagem de confirmação!
Soren Bjornstad 22/07/19
398

Como já mencionado, git commit --amendé a maneira de substituir o último commit. Uma observação: se você também deseja substituir os arquivos , o comando será

git commit -a --amend -m "My new commit message"
John
fonte
4
E se você não quiser adicionar tudo, primeiro pode fazê git add file.ext-logit commit --amend
MalcolmOcean
358

Você também pode usar git filter-branchpara isso.

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

Não é tão fácil quanto trivial git commit --amend, mas é especialmente útil, se você já tiver algumas mesclagens após sua mensagem de confirmação incorreta.

Observe que isso tentará reescrever todos os commit entre HEADe o commit defeituoso; portanto, você deve escolher seu msg-filtercomando com muita sabedoria ;-)

Marca
fonte
4
Existe uma versão disso que não altera a confirmação se o regex não encontrar nada?
sjakubowski
3
AFAIK filter-branch --msg-filter gerará novas confirmações em qualquer caso. No entanto, você pode verificar no filtro de mensagens, se o sed tiver êxito, e usar essas informações quando a operação de ramificação do filtro terminar para redefinir sua árvore para refs / original.
Mark
4
@DavidHogue Isso só é verdade quando se usa o método filter-branch. Os IDs de confirmação após uma confirmação modificada não serão alterados se você usar o rebase interativo.
6133 Mark
6
@ Mark Sim eles fazem, eles são obrigados a. Os IDs de confirmação dependem das confirmações anteriores. Se eles não mudassem, o git seria inútil.
Route de milhas
2
Você precisa $flawed_commit^..HEAD, não $flawed_commit..HEAD. como indicado na página de manual: « O comando só reescreverá as referências positivas mencionadas na linha de comando (por exemplo, se você passar a..b, apenas b será reescrito). »
Ángel
319

Eu prefiro assim:

git commit --amend -c <commit ID>

Caso contrário, haverá uma nova confirmação com um novo ID de confirmação.

krevedko
fonte
7
Para mim, o uso do comando acima na verdade cria uma nova confirmação com um novo ID de confirmação mais uma confirmação adicional dizendo "mesclar ramo" como uma mensagem de confirmação padrão.
Jan
46
A alteração sempre cria uma nova confirmação com um novo ID de confirmação. O ID de confirmação é o hash SHA do conteúdo da confirmação, incluindo a mensagem de confirmação e os carimbos de data / hora de autor / confirmação. Esse é um recurso do Git que, impedindo colisões de hash, garante que dois commits com o mesmo ID sejam exatamente o mesmo commit, com exatamente o mesmo conteúdo, histórico e assim por diante.
Emil Lundberg
7
Concordo com Emil. Além disso, lendo os documentos - parece que tudo o que "-c" faz é dizer ao git qual mensagem do commit usar como padrão / modelo para o seu novo commit .. Realmente ele já fará "-c <ID do commit>" por padrão , portanto, não é necessário especificá-lo.
Gal
2
O -cfaz algumas coisas. Ele usa a mensagem antiga por padrão, mas também copia informações de autoria (pessoa e hora). -Cfaz a mesma coisa, exceto que não solicita que você edite a mensagem.
Joseph K. Strauss
1
Como @SantanuDey, não funcionou para mim. Eu tenhofatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Andrew Grimm
312

Se você estiver usando a ferramenta Git GUI, há um botão chamado Alterar última confirmação . Clique nesse botão e ele exibirá seus últimos arquivos e mensagens de confirmação. Apenas edite essa mensagem e poderá confirmá-la com uma nova mensagem de confirmação.

Ou use este comando em um console / terminal:

git commit -a --amend -m "My new commit message"
Akhilraj NS
fonte
4
Esta resposta é literalmente idêntica a essa mais antiga . Você verificou as respostas existentes antes de fornecer outra?
Dan Dascalescu
284

Você pode usar o Git rebasing . Por exemplo, se você deseja modificar novamente para confirmar bbc643cd, execute

$ git rebase bbc643cd^ --interactive

No editor padrão, modifique 'pick' para 'edit' na linha cujo commit você deseja modificar. Faça as alterações e depois prepare-as com

$ git add <filepattern>

Agora você pode usar

$ git commit --amend

para modificar o commit e depois disso

$ git rebase --continue

para retornar ao commit principal anterior.

Shoaib Ud-Din
fonte
1
Se você quiser ter certeza de que suas alterações git commit --amendforam afetadas, use-o git showe ele exibirá a nova mensagem.
91113 Steve Tauber
279
  1. Se você deseja modificar apenas sua última mensagem de confirmação, faça:

    git commit --amend
    

Isso o levará ao seu editor de texto e permitirá que você altere a última mensagem de confirmação.

  1. Se você deseja alterar as três últimas mensagens de confirmação ou qualquer uma das mensagens de confirmação até esse ponto, forneça HEAD~3o git rebase -icomando:

    git rebase -i HEAD~3
    
Heena Hussain
fonte
6
Esta resposta anterior já diz que você pode usar git commit --amend, e também diz que você pode usar git rebase -i HEAD~commit_count, tudo que você fez foi tomada em 3para commit_count.
Votou também. As pessoas simplesmente não se preocupam em ler as respostas existentes .
Dan Dascalescu
261

Se você precisar alterar uma mensagem de confirmação antiga em vários ramos (ou seja, o commit com a mensagem incorreta está presente em vários ramos), convém usar:

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

O Git criará um diretório temporário para reescrever e fazer backup adicional de referências antigas no refs/original/.

  • -fimporá a execução da operação. Isso é necessário se o diretório temporário já estiver presente ou se já houver referências armazenadas refs/original. Se não for esse o caso, você pode soltar esse sinalizador.

  • -- separa as opções de ramificação do filtro das opções de revisão.

  • --allgarantirá que todas as ramificações e tags sejam reescritas.

Devido ao backup de suas referências antigas, você pode facilmente voltar ao estado antes de executar o comando.

Digamos, você deseja recuperar seu mestre e acessá-lo na ramificação old_master :

git checkout -b old_master refs/original/refs/heads/master
Sebers
fonte
3
Essa resposta não aborda a pergunta do OP, pois eles estão puramente interessados ​​em corrigir um commit que acabaram de concluir. Eu uso regularmente git commit --amendpara arrumar comentários ou adicionar arquivos I esqueceu de git add, mas apenas nunca antes eu git pushed. Também uso git filter-branchquando quero mexer totalmente com o histórico da versão, mas o OP não quer isso, então essa resposta precisa de um grande aviso de saúde - não tente fazer isso em casa, espreitadelas !!
kbro
226

Usar

git commit --amend

Para entender isso em detalhes, uma excelente postagem é 4. Reescrevendo o Git History . Ele também fala sobre quando não usar git commit --amend .

pele
fonte
2
Existe uma boa maneira de corrigir as mensagens de confirmação já enviadas para um repositório público? Até agora, cheguei à conclusão de que, uma vez pressionados, meus erros de digitação e pensamentos de mensagem de confirmação precisam viver para sempre.
stackunderflow
2
Em uma palavra, NOPE! Não há BOA maneira de retirar algo que você enviou. Todas as retrações são MAU em maior ou menor grau. Você precisa adotar a disciplina de trabalhar em uma ramificação em seu próprio repositório privado, realizando vários commits à medida que adiciona um pouco, testa um pouco, ajusta um pouco. Em seguida, mescle toda sua ramificação em uma única confirmação, escreva uma nova mensagem de confirmação descrevendo a alteração geral, PROVA-A e envie por push.
kbro
1
Apenas para apontar o óbvio que não é necessário fazer um único commit ao voltar de um ramo de recurso. O que muitas pessoas fazem é refazer o caminho no ramo de destino (para tornar as coisas mais limpas) e depois mesclar com a opção de suprimir o avanço rápido. Concorde com o ponto principal de ser cuidadoso antes de empurrar para cima.
ShawnFumo
1
A git commit --amendresposta já havia sido dada (várias vezes) antes de você escrever a sua. Por que você publicou novamente? Se você quiser adicionar um link para "Reescrevendo o histórico do Git", poderá ter editado uma das respostas existentes ou deixado um comentário.
Dan Dascalescu
199

Alterar

Você tem algumas opções aqui. Você pode fazer

git commit --amend

desde que seja seu último commit.

Rebase interativo

Caso contrário, se não for o seu último commit, você poderá fazer uma nova análise interativa,

git rebase -i [branched_from] [hash before commit]

Então, dentro da reestruturação interativa, você simplesmente adiciona edição a esse commit. Quando surgir, faça git commit --amendae modifique a mensagem de confirmação. Se você deseja reverter antes desse ponto de confirmação, também pode usar git refloge excluir essa confirmação. Então você apenas faz git commitnovamente.

wallerjake
fonte
191

Se for o seu último commit, basta alterar o commit:

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

(Usando o sinalizador -o( --only) para garantir que você altere apenas a mensagem de confirmação)


Se for um commit oculto, use a incrível re-interativa interativa :

git rebase -i @~9   # Show the last 9 commits in a text editor

Encontre a confirmação que você deseja, altere pickpara r( reword) e salve e feche o arquivo. Feito!



Tutorial do Miniature Vim (ou, como fazer o rebase com apenas 8 pressionamentos de tecla 3jcwrEscZZ):

  • Corra vimtutorse você tiver tempo
  • hjkl correspondem às teclas de movimento
  • Todos os comandos podem ser prefixados com um "intervalo", por exemplo, 3jdesce três linhas
  • i para entrar no modo de inserção - o texto digitado aparecerá no arquivo
  • Escou Ctrlcpara sair do modo de inserção e retornar ao modo "normal"
  • u desfazer
  • Ctrlr para refazer
  • dd, dw, dlPara apagar uma linha, palavra ou letra, respectivamente
  • cc, cw, clPara mudar uma linha, palavra ou letra, respectivamente (o mesmo queddi )
  • yy, yw, ylCopiar ( "puxão") uma linha, palavra ou letra, respectivamente
  • pou Pcolar após ou antes da posição atual, respectivamente
  • :wEnter salvar (gravar) um arquivo
  • :q!Enter sair sem salvar
  • :wqEnterou ZZpara salvar e sair

Se você editar muito o texto, mude para o layout do teclado Dvorak , aprenda a digitar e aprenda o Vim. Vale a pena o esforço? Sim.



ProTip ™: Não tenha medo de experimentar comandos "perigosos" que reescrevem o histórico * - O Git não exclui seus commits por 90 dias por padrão; você pode encontrá-los no reflog:

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* Cuidado com opções como --harde no --forceentanto - elas podem descartar dados. * Além disso, não reescreva o histórico nos ramos em que você está colaborando.

Zaz
fonte
3
A parte do vim é completamente fora de tópico e, em vez de incentivar os usuários a gastar tempo aprendendo a usar um editor misterioso, por que não ensiná-los algo mais específico, como como configurar o editor git padrão para ser algo amigável, como nano? Estamos falando de modificações triviais que precisam ser feitas em um arquivo de texto, não de codificação hardcore que geraria uma guerra de chamas sobre o "melhor" editor de texto.
Dan Dascalescu
1
@DanDascalescu: Como é mais rápido aprender o Vim usando as instruções acima do que executar várias rebases usando o nano. Todo o motivo pelo qual o git abre um editor de texto e não a sua própria interface para rebasing é porque o Vim existe: é leve, instalado por padrão na maioria dos sistemas e muito fácil de aprender o suficiente para executar um rebase com facilidade: por exemplo, ddjjpZZmove um commit 2 para baixo. Não há nada de misterioso no conhecimento básico do Vim; são necessários 10 minutos para ficar mais confortável com o Vim do que com o nano.
Zaz
185

Se você estiver usando a GUI do Git, poderá alterar o último commit que não foi enviado com:

Commit/Amend Last Commit
gulchrider
fonte
168

Eu uso a GUI do Git o máximo que posso e isso oferece a opção de alterar o último commit:

Marque essa caixa

Além disso, git rebase -i origin/masteré um bom mantra que sempre apresentará os commits que você fez no topo do master e oferece a opção de alterar, excluir, reordenar ou squash. Não há necessidade de se apossar desse hash primeiro.

Havard Graff
fonte
4
Como chego à tela que você exibiu no seu exemplo?
Marwan مروان
2
É a parte inferior direita do Windows Git Gui. Basta selecionar a opção 'Alterar última confirmação' e ela será preenchida com as informações de confirmação mais recentes.
precisa saber é o seguinte
138

Uau, então existem várias maneiras de fazer isso.

Outra maneira de fazer isso é excluir o último commit, mas mantenha as alterações para que você não perca seu trabalho. Você pode fazer outra confirmação com a mensagem corrigida. Isso seria algo como isto:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

Eu sempre faço isso se esquecer de adicionar um arquivo ou fazer uma alteração.

Lembre - se de especificar em --softvez de --hard, caso contrário, você perderá totalmente o commit.

Radu Murzea
fonte
5
Isso faz exatamente a mesma coisa, git commit --amendexceto que é um processo de duas etapas.
Joseph K. Strauss
3
@ JosephK.Strauss Acredito que alterar o commit também mantém as informações originais do autor e da data do commit, tendo o novo commiter e as informações da data separadamente. Não tenho certeza de que essa abordagem faça isso.
everton
4
@ EvertonAgner Você está correto. --amendmanterá as informações do autor, mas a pergunta pede apenas para alterar a mensagem.
Joseph K. Strauss
131

Para quem procura uma GUI do Windows / Mac para ajudar na edição de mensagens antigas (ou seja, não apenas na última mensagem), recomendo o Sourcetree . Os passos a seguir estão abaixo.

Rebase interativa Sourcetree

Para confirmações que ainda não foram enviadas para um controle remoto:

  1. Verifique se você comprometeu ou ocultou todas as alterações atuais (ou seja, para que não haja arquivos listados na guia "Status do arquivo") - isso não funcionará de outra maneira.
  2. Na guia "Log / Histórico", clique com o botão direito do mouse na entrada com uma linha adjacente no gráfico abaixo da (s) confirmação (ões) que você deseja editar e selecione "Rebase children of <commit ref> interactivamente ..."
  3. Selecione a linha inteira para uma mensagem de confirmação que você deseja alterar (clique na coluna "Mensagem") .
  4. Clique no botão "Editar mensagem".
  5. Edite a mensagem conforme desejado na caixa de diálogo exibida e clique em OK.
  6. Repita as etapas de 3 a 4 se houver outras mensagens de confirmação a serem alteradas.
  7. Clique em OK: O rebasing começará. Se tudo estiver bem, a saída terminará "Concluído com sucesso". NOTA: Às vezes, vejo isso falhar Unable to create 'project_path/.git/index.lock': File exists.ao tentar modificar várias mensagens de confirmação ao mesmo tempo. Não tenho certeza exatamente qual é o problema ou se será corrigido em uma versão futura do Sourcetree, mas se isso acontecer, recomendo refazê-lo um de cada vez (mais lento, mas parece mais confiável).

... Ou ... para confirmações que já foram enviadas:

Siga as etapas nesta resposta , que são semelhantes às anteriores, mas exigem que um comando adicional seja executado a partir da linha de comando ( git push origin <branch> -f) para forçar a ramificação forçada. Eu recomendo ler tudo e aplicar o cuidado necessário!

Steve Chambers
fonte
de todas as respostas - essa é a mais apropriada para todos os iniciantes do git ^^^ (use um programa gratuito SourceTree e aplique "Rebase children of" em um commit antes do que você deseja editar)
revt
127

Se você apenas deseja editar a confirmação mais recente, use:

git commit --amend

ou

git commit --amend -m 'one line message'

Mas se você deseja editar várias confirmações consecutivas, use rebasing:

git rebase -i <hash of one commit before the wrong commit>

Edição de rebase do Git

Em um arquivo, como o acima, escreva edit/e ou uma das outras opções e clique em salvar e sair.

Agora você estará no primeiro commit errado. Faça alterações nos arquivos, e eles serão testados automaticamente para você. Tipo

git commit --amend

Salve e saia disso e digite

git rebase --continue

para passar para a próxima seleção até terminar todas as suas seleções.

Observe que essas coisas alteram todos os seus hashes SHA após esse commit específico.

Shubham Chaudhary
fonte
2
git rebase -i <hash de um commit antes do commit errado> funciona para mim. obrigado.
Viraths
127

Se você deseja alterar apenas sua última mensagem, use o --onlysinalizador ou seu atalho -ocom commit --amend:

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

Isso garante que você não aprimore acidentalmente seu commit com coisas em etapas. Claro que é melhor ter uma $EDITORconfiguração adequada . Então você pode deixar a -mopção de fora e o Git preencherá previamente a mensagem de confirmação com a antiga. Desta forma, pode ser facilmente editado.

David Ongaro
fonte
1
A resposta "superior" não responde à pergunta. Apenas fornece uma introdução geral a git commit --amend. A questão era muito específica, portanto, mais longa! = Melhor. A menção decisiva da -obandeira provavelmente seria enterrada no restante das informações. Também não estou confortável em editar uma resposta que já tenha tantos votos.
David Ongaro
2
Dito isto, você pode editar a resposta principal, pois existe um perigo real de que as pessoas a usem como a resposta "correta". Pode facilmente alterar seu commit com coisas encenadas - aconteceu comigo, e é realmente irritante quando você faz isso. Mas, ainda assim, a quantidade não é garantia de correção. Nem em número de respostas nem em número de votos.
David Ongaro
1
Eu não chegaria tão longe a dizer que a resposta principal está "incorreta" e que "não responde à pergunta". Definitivamente funciona e responde à pergunta, você só precisa ter certeza de que não possui alterações em etapas ao tentar fazer a alteração. Mas vejo o seu ponto de ter que avisar as pessoas sobre isso. Vou editá-lo mais tarde, se tiver tempo.
1
Para ser justo: mesmo que a --onlyopção com --amendesteja disponível desde o git 1.3.0, ela não funcionou corretamente até que foi corrigida no 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Portanto, a resposta de volta à direita em 2008 provavelmente teria sido algo como: git stash; git commit --amend; git stash pop.
David Ongaro
103

Atualize sua última mensagem de confirmação incorreta com a nova mensagem de confirmação em uma linha:

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

Ou tente o Git reset como abaixo:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

Usando reset para dividir confirmações em confirmações menores

git reset também pode ajudá-lo a dividir uma confirmação em várias confirmações:

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

Aqui você quebrou com êxito seu último commit em dois commits.

przbadu
fonte
3
Se tudo o que você deseja fazer é editar a mensagem do seu último commit, o uso de uma reinicialização suave para esse fim é extermínio . Basta usar git commit --amend, exatamente como diz a resposta votada no topo . Além disso, git reset --soft HEAD^funciona de maneira idêntica à redefinição suave nesta resposta anterior , porque ambas são redefinidas para o primeiro commit pai.
3
Eu apenas me preocupo em adicionar git reseta solução apenas para ter uma idéia de dividir uma mensagem de confirmação em várias mensagens de confirmação. Porque, eu enfrentei esse problema quando, eu estava começando a usar git. Às vezes, isso pode ser realmente útil. :)
przbadu
87

Nesta pergunta há muitas respostas, mas nenhuma delas explica em detalhes como alterar as mensagens de confirmação mais antigas usando o Vim . Eu mesmo estava tentando fazer isso, então aqui vou escrever em detalhes como fiz isso especialmente para pessoas que não têm experiência no Vim!

Eu queria alterar meus cinco últimos commits que já enviei para o servidor. Isso é bastante "perigoso", porque se alguém já se retirou disso, você pode estragar as coisas alterando as mensagens de confirmação. No entanto, quando você estiver trabalhando em seu próprio ramo e tiver certeza de que ninguém o puxou, poderá alterá-lo assim:

Digamos que você queira alterar seus cinco últimos commits e digite isso no terminal:

git rebase -i HEAD~5

* Onde 5 é o número de mensagens de confirmação que você deseja alterar (por isso, se você deseja alterar a décima para a última confirmação, digite 10).

Este comando o levará ao Vim, onde você pode 'editar' seu histórico de confirmação. Você verá seus cinco últimos commits no topo desta maneira:

pick <commit hash> commit message

Em vez de pickvocê precisar escrever reword. Você pode fazer isso no Vim digitando i. Isso faz você entrar no modo de inserção . (Você vê que está no modo de inserção com a palavra INSERIR na parte inferior.) Para as confirmações que deseja alterar, digite em rewordvez de pick.

Então você precisa salvar e sair desta tela. Você faz isso entrando primeiro no 'modo de comando' pressionando o Escbotão (você pode verificar se está no modo de comando se a palavra INSERIR na parte inferior desapareceu). Então você pode digitar um comando digitando :. O comando para salvar e sair é wq. Então, se você digitar, :wqestá no caminho certo.

Em seguida, o Vim examinará todas as mensagens de confirmação que você deseja reformular e aqui você poderá alterar as mensagens de confirmação. Você fará isso entrando no modo de inserção, alterando a mensagem de confirmação, entrando no modo de comando e salvando e saindo. Faça isso cinco vezes e você estará fora do Vim!

Então, se você já enviou suas confirmações erradas, precisa git push --forcesubstituí-las. Lembre-se de que git push --forceé uma coisa muito perigosa a se fazer, portanto, certifique-se de que ninguém retirou do servidor desde que você enviou suas confirmações erradas!

Agora você mudou suas mensagens de confirmação!

(Como você vê, eu não sou tão experiente no Vim, por isso, se eu usei o 'jargão' errado para explicar o que está acontecendo, fique à vontade para me corrigir!)

Marijn
fonte
4
<nitpick>Não há "threads" no Stack Overflow, porque não é um fórum de discussão, existem apenas "perguntas", "respostas" e "postagens". </nitpick>. Além disso, nem todas as versões do Vim são iguais, nem todas permitem excluir caracteres no modo de inserção (faz sentido de certa forma, certo?). Se você quer sempre ser capaz de excluir caracteres no Vim, Xe xvai fazer isso (pequenos xapaga os caracteres na frente do cursor, Xirá eliminar para trás). Se você cometer erros, poderá usar uvárias vezes para desfazer. Finalmente, ré uma abreviação de rewordno editor de rebase interativo.
1
Alterar uma palavra no vim é cwdigitado no início (embora a pergunta não seja sobre o vim, eu concordo).
Yaroslav Nikitenko
Você não precisa usar essa abominação . Você pode definir seu editor git para algo saudável e amigável, como nanoo mcedit do Midnight Commander.
Dan Dascalescu
79

Você pode usar git-rebase-reword

Ele foi projetado para editar qualquer confirmação (e não apenas a última) da mesma maneira que commit --amend

$ git rebase-reword <commit-or-refname>

É nomeado após a ação de rebase interativa para alterar uma confirmação: "reformulação". Veja este post e o modo interativo man- section-

Exemplos:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^
albfan
fonte
6
Isso requer a instalação de um programa externo. Na minha opinião, seria melhor aprender a usar as ferramentas e aliases internos de forma mais eficaz. Eu digitava: g c; g rb -i @~9(commit e rebase), movo o novo commit para onde eu quero, mude commitpara f( fixup) e salve. Se você queria algo mais rápido do que isso, você poderia apelido git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Zaz
79

Eu adicionei os aliases recie recmpara recommit (amend)isso. Agora eu posso fazer isso com git recmou git recm -m:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
Chu-Siang Lai
fonte
57

Percebi que havia enviado um commit com um erro de digitação. Para desfazer, fiz o seguinte:

git commit --amend -m "T-1000, advanced prototype"
git push --force

Aviso: forçar o envio de suas alterações substituirá o ramo remoto pelo local. Certifique-se de não substituir o que deseja manter. Também seja cauteloso ao forçar o envio de uma confirmação alterada (reescrita) se alguém compartilhar o ramo com você, pois precisará reescrever seu próprio histórico se tiver a cópia antiga da confirmação que você acabou de reescrever.

neoneye
fonte
7
Nada fica "sobrescrito" no git. Nesse caso, o ponteiro de ramificação será definido como seu novo commit e o commit antigo ficará obsoleto se nenhuma referência for deixada e pode ser limpo após algumas semanas. (Até então os outros ainda pode encontrar e referenciá-lo, por exemplo, olhando para o reflog.)
David Ongaro
51

Eu gosto de usar o seguinte:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>
Kedar Adhikari
fonte
46

Se você não enviou o código para sua ramificação remota ( GitHub / Bitbucket ), você pode alterar a mensagem de confirmação na linha de comando, como abaixo.

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

Se você estiver trabalhando em uma ramificação específica, faça o seguinte:

git commit --amend -m "BRANCH-NAME: new message"

Se você já inseriu o código com a mensagem errada e precisa ter cuidado ao alterar a mensagem. Ou seja, depois de alterar a mensagem de confirmação e tentar enviá-la novamente, você acaba tendo problemas. Para facilitar, siga estas etapas.

Por favor, leia toda a minha resposta antes de fazê-lo.

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

Nota importante: Ao usar o push forçado diretamente, você pode acabar com problemas de código nos quais outros desenvolvedores estão trabalhando no mesmo ramo. Portanto, para evitar esses conflitos, você precisa extrair o código de sua ramificação antes de fazer a força forçar :

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

Essa é a melhor prática ao alterar a mensagem de confirmação, se já tiver sido enviada.

Prabhakar Undurthi
fonte