Fiz uma alteração e esqueci de adicionar um arquivo ao conjunto de alterações. Depois de outros commits, percebi que agora o arquivo está faltando em um HEAD^4
commit.
Como reescrevo um commit anterior para incluir o arquivo ausente?
git
git-commit
Kolrie
fonte
fonte
Respostas:
Use
git rebase --interactive HEAD~4
e defina aedit
opção para o commit que você gostaria de alterar.Lembre-se de que você não deve modificar os commits enviados ao repositório remoto desta forma. É melhor adicionar um novo commit com o arquivo ausente nesse caso.
fonte
git push -f
se eu tivesse certeza de que o upstream não mudou?add
instalado os arquivos ausentes, então fiz um commit com "xxx" na mensagem. Então fiz o comando rebase e mudei o commit "xxx" de "pick" para "edit". Então eu fiz "git rebase --continue". Agora, quando olho para o histórico, tenho "xxx" como o commit mais recente, e o commit anterior ao qual eu queria adicioná-los permanece inalterado! Eu me pergunto onde foi meu erro?Sei que as pessoas podem pesquisar no Google e vir aqui para encontrar uma resposta mais simples: e se fosse apenas o último commit? (A pergunta de OP é para consertar o 4º commit na história)
No caso de você se comprometer e perceber que esqueceu de adicionar algum arquivo imediatamente , basta fazer:
Onde
--no-edit
manterá a mesma mensagem de commit.Mole-mole!
fonte
--amend
têm hashes diferentesHEAD^4
. Tudo bem do jeito que está, apenas como um adendo para referência. ;)Se você NÃO enviou esses 4 commits, você pode fazer isso da seguinte maneira:
Crie arquivos de patch para todos esses commits:
Retroceda em 4 confirmações:
Adicionar arquivo ausente:
Comprometa-se com
--amend
:Aplique todos os patches salvos de volta:
Se você tiver feito push, NÃO deve usar este método. Em vez disso, apenas admita seu erro e crie mais um commit no HEAD que corrige esse problema.
fonte
git format-patch
/git am
muito melhor. E o mais importante, dá a você mais confiança se você errar em algo - commit salvo como patch em arquivo físico é sua melhor rede de segurança.git gc
:)rm *.patch
)Embora a resposta aceita esteja correta, faltam instruções detalhadas sobre como executar a edição de um commit durante um processo de rebase.
Primeiro, inicie um processo de rebase:
Uma lista de commits será apresentada, escolha um commit que você deseja editar mudando a palavra
pick
paraedit
e salve o arquivo.Faça as modificações necessárias em seu código (lembre-se de invocar
git add
para novos arquivos)Depois que todas as modificações forem feitas, problema
git commit --amend
- isso irá corrigir um commit marcado comoedit
Invoque
git rebase --continue
que encerrará o processo (se houver mais commits marcados comoedit
, as etapas acima precisam ser repetidas)Anotações importantes:
NÃO remova as linhas marcadas como
pick
que você não deseja editar - deixe-as como estão. A exclusão dessas linhas resultará na exclusão de commits relacionadosO GIT força você a fazer o
stash
rebase antes do rebase, se seu diretório de trabalho não estiver limpo; você pode, no entanto,git stash pop / git stash apply
durante o rebase, a fim de corrigir essas alterações (ou seja, alterações armazenadas antes de iniciar o processo de rebase) para um commit marcado comoedit
se algo deu errado e você deseja reverter as alterações feitas durante o processo de rebase antes de terminar (ou seja, você deseja reverter ao ponto antes de iniciar o rebase), use
git rebase --abort
- também leia: Como abortar um rebase interativo se --abort não ' t funciona?Conforme dito na resposta aceita:
A resposta está no livro Git (parágrafo intitulado " The Perils of Rebasing "):
fonte