Como alterar os commits existentes e não enviados?

Eu escrevi a coisa errada na mensagem de commit. Além disso, esqueci de incluir alguns arquivos.

Como mudar a mensagem / arquivos commit? O commit ainda não foi iniciado.

7676
07 окт. definido por Laurie Young 07 out 2008-10-07 18:44 '08 às 18:44 2008-10-07 18:44
@ 27 respostas

Alterações na mensagem de confirmação mais recente

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

... No entanto, isso pode dificultar a entrada de mensagens de confirmação de várias linhas ou pequenas correções.

Antes de fazer isso, certifique-se de não ter nenhuma alteração na cópia de trabalho; caso contrário, elas serão corrigidas. (Não fez alterações não serão corrigidas.)

Modificando a mensagem de confirmação que você já enviou para o ramo remoto

Se você já enviou seu commit para um branch remoto, então você precisa forçar o commit com:

SHA , o que cria um problema se outras pessoas tiverem cópias de commits antigos que você tenha reescrito.  Qualquer pessoa que tenha uma cópia de um commit antigo terá que sincronizar seu trabalho com o commit recém-reescrito, o que às vezes pode ser difícil, então assegure-se de coordenar com os outros ao tentar reescrever o histórico de um commit comum, ou simplesmente reescrever o total de commits em geral. 


Use rebaz interativo

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

Para fazer o git squash, siga estes passos:

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

Assim que você esmagar seus commits, selecione e/r para editar a mensagem.

2019

07 окт. A resposta é dada EfForEffort 07 oct. 2008-10-07 18:50 '08 at 6:50 pm 2008-10-07 18:50
2438
08 февр. A resposta é dada lfx_cool 08 fev 2010-02-08 07:26 '10 at 7:26 am 2010-02-08 07:26

Se a correção que você deseja corrigir não for a última:

  • git rebase --interactive $parent_of_flawed_commit

    Se você quiser consertar vários commits errados, passe o código pai do mais antigo.

  • Um editor aparece com uma lista de todos os commits desde que você o deu.

    • Alterar pick para reword (ou versões antigas do Git, para edit ) antes de qualquer correção que você deseja corrigir.
    • Depois de salvar, o Git irá repetir os commits listados.

  • Para cada commit que você deseja refazer, o Git o levará de volta ao seu editor. Para cada commit que você deseja alterar, o Git coloca você em uma shell. Se você estiver em um shell:

    • Altere a fixação de alguma forma.
    • git commit --amend
    • git rebase --continue

A maior parte desta seqüência será explicada pela saída de várias equipes em movimento. É muito fácil, você não precisa memorizá-lo - lembre-se que git rebase --interactive permite que você conserte, não importa quanto tempo eles estivessem.


Observe que você não deseja alterar os compromissos que você já pressionou. Ou talvez você queira, mas neste caso você terá que tomar muito cuidado para se comunicar com todos que podem ter tirado seus commits e feito trabalhos em cima deles. Como restaurar / ressincronizar depois que alguém arrastou um rebase ou redefinir para um segmento publicado?

2321
07 окт. a resposta é dada por Aristóteles Pagaltzis Oct 07 2008-10-07 22:52 '08 às 10:52 pm 2008-10-07 22:52

Para fazer alterações em um commit anterior, faça as alterações necessárias e faça essas alterações e, em seguida, execute

 git commit --amend -C HEAD 

Para corrigir o commit anterior, removendo-o completamente, execute

 git rebase -i HEAD~ commit_count 

(Substitua commit_count pelo número de confirmações que você deseja alterar). Esse comando inicia seu editor. Marque o primeiro retentor (aquele que você deseja alterar) como "editar" em vez de "selecionar", depois salve e saia do editor. Faça as alterações que você deseja confirmar e, em seguida, execute

758
16 авг. A resposta é dada por Fatih 16 ago. 2011-08-16 00:20 '11 às 0:20 2011-08-16 00:20

Como mencionado, git commit --amend é uma maneira de sobrescrever o último commit. Uma nota: se você quiser também sobrescrever arquivos , o comando será

390
07 июня '11 в 0:16 2011-06-07 00:16 a resposta é dada por John em 07 de junho de 2011 às 00:16 2011-06-07 00:16

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

351
01 сент. Responder Mark 01 set 2012-09-01 23:35 '12 às 23:35 2012-09-01 23:35

Eu prefiro assim.

 git commit --amend -c <commit ID> 

Caso contrário, haverá um novo commit com um novo ID de commit.

312
10 янв. Resposta dada por krevedko 10 de jan 2013-01-10 17:23 '13 às 17:23 2013-01-10 17:23

Se você usar a ferramenta Git GUI, existe um botão chamado last last commit. Clique nesse botão e exiba seus arquivos e mensagens de confirmação mais recentes. Basta editar esta mensagem e você pode corrigi-lo com uma nova mensagem de confirmação.

Ou use este comando no console / terminal:

 git commit -a --amend -m "My new commit message" 
309
08 нояб. a resposta é dada Akhilraj NS 08 nov. 2012-11-08 06:51 '12 em 6:51 am 2012-11-08 06:51

Você pode usar o git rebasing . Por exemplo, se você quiser mudar de volta para cometer bbc643cd, execute

 $ git rebase bbc643cd^ --interactive 

No editor padrão, altere 'pick' para 'edit' na linha cujo commit você deseja alterar. Faça as alterações e, em seguida, execute-as com

 $ git add <filepattern> 

Agora você pode usar

 $ git commit --amend 

para alterar o commit, e depois disso

 $ git rebase --continue 

para retornar à fixação do capítulo anterior.

282
22 янв. a resposta é dada por Shoaib Ud-Din 22 Jan 2013-01-22 20:23 '13 às 20:23 2013-01-22 20:23
  • Se você quiser alterar a última mensagem de confirmação, siga estas etapas:

     git commit --amend 

    Isso levará você ao seu editor de texto e permitirá que você altere a última mensagem do commit.

  • Se você quiser alterar as últimas 3 mensagens de commit ou qualquer mensagem de commit para este ponto, coloque HEAD~3 no git rebase -i :

     git rebase -i HEAD~3 
275
22 окт. Resposta dada por Heena Hussain 22 de outubro 2012-10-22 14:22 '12 às 2:22 pm 2012-10-22 14:22

Se você precisar alterar a antiga mensagem de confirmação para várias ramificações (ou seja, uma mensagem com uma mensagem de erro estiver presente em várias ramificações), será possível usar:

15 нояб. A resposta é dada por sebers em 15 de novembro. 2012-11-15 12:29 '12 às 12:29 2012-11-15 12:29

uso de

 git commit --amend 

Para entender isso em detalhes, um excelente post é 4. Sobrescrever a história do Git . Ele também informa quando não usar o git commit --amend .

221
27 марта '13 в 23:43 2013-03-27 23:43 a resposta é dada pele 27 de março de 2013 às 23:43 2013-03-27 23:43

Alterar

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

 git commit --amend 

até que seja executado por último.

Redirecionamento interativo

Caso contrário, se este não for seu último commit, você pode executar uma reinicialização interativa,

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

Então, dentro do redirecionamento interativo, você simplesmente adiciona uma edição a este commit. Quando isso acontecer, faça o git commit --amend e mude a mensagem de commit. Se você quiser voltar a este ponto de fixação, você também pode usar o git reflog e simplesmente remover essa correção. Então você executa o git commit novamente.

195
18 янв. A resposta é dada wallerjake 18 de janeiro 2013-01-18 04:45 '13 às 4:45 am 2013-01-18 04:45

Se você usar a GUI do Git, poderá alterar a última confirmação que não foi clicada:

 Commit/Amend Last Commit 
183
01 дек. A resposta é dada por gulchrider 01 dez. 2012-12-01 08:03 '12 às 8:03 2012-12-01 08:03

Se este é seu último commit, apenas corrija o commit:

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

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


Se parece um commit, use um rebase interativo incrível:

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

Encontre o commit desejado, altere pick para r ( reword ) e salve e feche o arquivo. Feito!



Tutorial tutorial em miniatura (ou, como reinstalar apenas 8 teclas digitadas 3j cw r Esc ZZ ):

  • Execute o vimtutor se você tiver tempo.
  • h j k l corresponde às teclas de navegação
  • Todos os comandos podem ter um prefixo de intervalo, por exemplo. 3j move para 3 linhas
  • i , para entrar no modo de inserção - o texto digitado aparecerá no arquivo
  • Esc ou Ctrl c para sair do modo de inserção e retornar ao modo normal.
  • u cancelar
  • Ctrl r para repetir
  • dd , dw , dl para excluir uma linha, palavra ou letra, respectivamente
  • cc , cw , cl para alterar uma linha, palavra ou letra, respectivamente (o mesmo que dd i )
  • yy , yw , yl para copiar ("yank") linhas, palavras ou letras, respectivamente
  • p ou p para inserir após ou antes da posição atual, respectivamente
  • :w Enter para salvar (gravar) arquivo
  • :q! Entre na saída sem salvar
  • :wq Enter ou ZZ para salvar e sair

Se você estiver editando muito texto, mude para o layout do teclado Dvorak, aprenda o tipo de toque 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 remove suas correções por 90 dias por padrão; Você pode encontrá-los no reflog:

 $ git reset @~3 # go back 3 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 parâmetros como --hard e --force , embora possam descartar dados.
* Também não reescreva o histórico em nenhum ramo com o qual você cooperar.

170
10 февр. A resposta é dada Zaz 10 de fevereiro 2015-02-10 03:01 '15 às 3:01 2015-02-10 03:01

Eu uso o Git GUI o máximo que posso, e isso te dá a oportunidade de mudar a última mensagem:

2019

165
05 авг. a resposta é dada por Havard Graff 05 ago. 2013-08-05 02:13 '13 às 2:13 2013-08-05 02:13

Uau, então há muitas maneiras de fazer isso.

Outra maneira de fazer isso é excluir o último commit, mas salvar as alterações para que você não perca seu emprego. Você pode então executar outro commit com uma mensagem corrigida. Será algo parecido com isto:

135
03 дек. A resposta é dada por Radu Murzea 03 dez. 2013-12-03 00:31 '13 às 0:31 2013-12-03 00:31

Se você quiser alterar o último uso do commit:

 git commit --amend 

ou

124
07 янв. Resposta dada por Shubham Chaudhary 07 jan 2014-01-07 01:03 '14 às 1:03 2014-01-07 01:03

Para aqueles que procuram uma interface gráfica do usuário para Windows / Mac para ajudar a editar mensagens antigas (ou seja, não apenas a mensagem mais recente), eu recomendaria o SourceTree . Passos a seguir abaixo.

2019

123
06 нояб. Resposta é dada por Steve Chambers Nov 06 2014-11-06 18:01 '14 às 18:01 2014-11-06 18:01

Se você quiser mudar a última mensagem, você deve usar o sinalizador --only ou seu atalho -o com commit --amend :

122
23 мая '14 в 11:40 2014-05-23 11:40 respondeu a David Ongaro em 23 de maio de '14 às 11:40 2014-05-23 11:40

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

 # 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. 

Use reset para dividir commits em commits menores.

git reset pode ajudá-lo a quebrar um commit em vários commits:

99
22 янв. a resposta é dada przbadu 22 de janeiro 2014-01-22 11:57 '14 às 11:57 2014-01-22 11:57

Há muitas respostas para essa pergunta, mas nenhuma delas explica detalhadamente como alterar as mensagens de fixação antigas com o VIM. Eu estou preso tentando fazer isso sozinho, então aqui vou te contar em detalhes como eu fiz isso especialmente para pessoas que não têm experiência em VIM!

Eu queria mudar meus últimos cinco commits que eu já tinha clicado no servidor. É muito “perigoso” se alguém mais sair dele, você pode danificar as coisas mudando as mensagens de commit. No entanto, quando você está trabalhando em seu pequeno ramo e tem certeza de que ninguém o puxou, você pode alterá-lo da seguinte maneira:

Suponha que você queira alterar seus últimos cinco commits e, em seguida, insira isso no terminal:

git rebase -i HEAD~5 * Onde 5 é o número de mensagens de confirmação que você deseja alterar. (então se você quiser mudar o 10º para o último commit, digite 10)

Este comando leva você ao VIM, onde você pode editar seu histórico de commits. Você verá os últimos 5 commits no topo:

pick <commit hash> commit message

Em vez de pick você precisa escrever um novo reword . Você pode fazer isso no VIM digitando i , o que obriga a entrar no modo INSERT. (Você pode ver que você está no modo de inserção com a palavra INSERT abaixo). Para commits, você quer mudar o tipo em reword em vez de pick

Então você precisa salvar e sair desta tela, você faz isso primeiro mudando para o modo de comando pressionando o botão esc. (вы можете проверить, что вы находитесь в режиме command-, если слово INSERT внизу исчезло). Затем вы можете ввести команду, набрав : , команда сохранения и выхода - wq . Поэтому, если вы наберете :wq youre ont, он будет прав.