O que você precisa fazer é criar uma nova confirmação com os mesmos detalhes que a HEAD
confirmação atual , mas com o pai como a versão anterior HEAD
. git reset --soft
moverá o ponteiro da ramificação para que a próxima confirmação ocorra em cima de uma confirmação diferente de onde está o cabeçalho da ramificação atual.
# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}
# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
git reflog
para encontrar o número correto, por exemplo{2}
.git commit --amend
. O segundo é um "refazer" em um novo commit. Eles funcionam para qualquer umgit commit
, não apenas--amend
.git commit
.git reset --soft HEAD@{1}
:fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
. Quando substituíHEAD@{1}
pelo hash de commit equivalente mostrado emgit reflog
(obrigado JJD!), Essa resposta funcionou maravilhosamente!HEAD@{1}
. Se eu rodarecho HEAD@{1}
no tcsh, por exemplo, a saída éHEAD@1
porque as chaves foram interpretadas pelo tcsh. Se eu usar aspas simples, as chaves são preservadas.use o ref-log :
você deve ter todas as alterações alteradas anteriormente apenas na sua cópia de trabalho e pode confirmar novamente
para ver uma lista completa dos índices anteriores
git reflog
fonte
HEAD@{1}
eHEAD~1
?HEAD~1
é exatamente o mesmoHEAD^
e identifica o pai do commit atual.HEAD@{1}
por outro lado, refere-se ao commit que o HEAD apontou antes deste, ou seja, eles significam commits diferentes quando você faz checkout de um ramo diferente ou altera um commit.git reset HEAD@{1}
é o suficiente.Encontre seus commits alterados por:
Nota: Você pode adicionar
--patch
para ver o corpo dos commit para maior clareza. Igual agit reflog
.redefina seu HEAD para qualquer confirmação anterior no momento em que estiver correto:
Nota: Substitua SHA1 pelo seu hash de confirmação real. Observe também que este comando perderá todas as alterações não confirmadas, portanto você pode ocultá-las antes. Como alternativa, use
--soft
para manter as alterações mais recentes e, em seguida, confirme-as.Em seguida, escolha a outra confirmação que você precisa sobre ela:
fonte
git reset SHA1 --soft
, poderá reter as alterações mais recentes e depois confirmar.Você sempre pode dividir um commit, a partir do manual
fonte
git reflog
é tudo que você precisagit reset
vez degit reset --soft
, e façagit add --patch
.Possivelmente, vale a pena notar que, se você ainda estiver no seu editor com a mensagem de confirmação, poderá excluir a mensagem de confirmação e ela abortará o
git commit --amend
comando.fonte
Talvez possa usar
git reflog
para obter dois commit antes de emendar e depois de emendar.Em seguida, use
git diff before_commit_id after_commit_id > d.diff
para obter diferenças entre antes e depois da alteração.Próximo uso
git checkout before_commit_id
para voltar antes de confirmarE último uso
git apply d.diff
para aplicar a mudança real que você fez.Isso resolve meu problema.
fonte
Se você enviou a confirmação para remotamente e, em seguida, alterou erroneamente as alterações nessa confirmação, isso resolverá o seu problema. Emita a
git log
para localizar o SHA antes da confirmação. (isso pressupõe que remoto é denominado origem). Agora emita esses comandos usando esse SHA.fonte
Você pode fazer abaixo para desfazer sua
git commit —amend
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull origin your_branch_name
====================================
Agora suas alterações são como as anteriores. Então você está pronto para desfazer
git commit —amend
Agora você pode fazer
git push origin <your_branch_name>
, empurrar para o ramo.fonte
Quase 9 anos atrasado para isso, mas não vi essa variação mencionada realizando a mesma coisa (é uma combinação de algumas delas, semelhante à resposta principal ( https://stackoverflow.com/a/1459264/4642530 ) .
Pesquisar todas as cabeças destacadas na ramificação
git reflog show origin/BRANCH_NAME --date=relative
Em seguida, encontre o hash SHA1
Redefinir para SHA1 antigo
git reset --hard SHA1
Em seguida, empurre-o de volta.
git push origin BRANCH_NAME
Feito.
Isso fará com que você retorne totalmente ao antigo commit.
(Incluindo a data do cabeçalho de confirmação separado e sobrescrito)
fonte
--soft
para manter minhas alterações. Eu só quero que cometeu separadamenteFazer checkout para ramificação temporária com o último commit
git branch temp HEAD@{1}
Redefinir última confirmação
git reset temp
Agora, você terá todos os arquivos confirmados e confirmados anteriormente. Verifique o status de todos os arquivos.
git status
Redefina seus arquivos de confirmação do estágio git.
git reset myfile1.js
(em breve)Anexe novamente este commit
git commit -C HEAD@{1}
Adicione e confirme seus arquivos para o novo commit.
fonte