Acidentalmente enviei os arquivos errados para o Git , mas ainda não enviei a confirmação para o servidor.
Como posso desfazer essas confirmações do repositório local?
git
version-control
git-commit
undo
pre-commit
Peter Mortensen
fonte
fonte
git undo
, é isso aí. Então a reputação que o git tem de lidar com os erros cometidos por nós meros mortais desaparece. Implemente pressionando o estado atual em uma pilha git antes de executar qualquergit
comando. Isso afetaria o desempenho, portanto, seria melhor adicionar um sinalizador de configuração para habilitá-lo.alias
recurso do Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliasesgit reflog
já está próximo do que você descreve, mas oferece ao usuário mais controle sobre o que deve ser (des) feito. Mas por favor, não, "desfazer" não funciona da mesma maneira em todos os lugares, e as pessoas esperam muitas coisas diferentes para o recurso alcançar. Desfazer a última confirmação? Desfazer a última ação? Se a última ação foi um push, desfaça exatamente como (redefinir e empurrar) ou (reverter e empurrar)?Respostas:
Desfazer uma confirmação e refazer
git status
, então você precisará adicione-os novamente antes de confirmar). Se você única querer adicionar mais mudanças para cometer o anterior, ou mudar a mensagem de commit 1 , você poderia usargit reset --soft HEAD~
em vez disso, que é comogit reset HEAD~
2 , mas deixa as alterações existentes encenado.git add
qualquer coisa que você queira incluir em seu novo commit.reset
copiou a cabeça antiga para.git/ORIG_HEAD
;commit
O with-c ORIG_HEAD
abrirá um editor, que inicialmente contém a mensagem de log do commit antigo e permite que você edite. Se você não precisar editar a mensagem, poderá usar a-C
opçãoCuidado, no entanto, se você tiver adicionado novas alterações ao índice, o uso
commit --amend
delas será adicionado ao seu commit anterior.Se o código já foi enviado ao seu servidor e você tem permissões para substituir o histórico (rebase), então:
Você também pode olhar para esta resposta:
Como posso mover o HEAD de volta para um local anterior? (Cabeça desanexada) e Desfazer confirma
A resposta acima mostrará
git reflog,
qual é usado para descobrir o que é o SHA-1, que você deseja reverter. Depois de encontrar o ponto em que deseja desfazer, use a sequência de comandos conforme explicado acima.1 Observe, no entanto, que você não precisa redefinir para uma confirmação anterior se tiver cometido um erro na sua mensagem de confirmação . A opção mais fácil é
git reset
(desfazer as alterações feitas desde então) egit commit --amend
, em seguida , abrir o editor de mensagens de confirmação padrão preenchido previamente com a última mensagem de confirmação.2
HEAD~
é o mesmo queHEAD~1
. Além disso, consulte O que é o HEAD no git? . É útil se você deseja cancelar várias confirmações.fonte
git checkout theRightBranch
com todos os estágios de mudanças. Como eu apenas tinha que fazer.git reset --soft HEAD^
precisar usargit reset --soft HEAD~1
. O ^ é um caractere de continuação no DOS, portanto não funcionará corretamente. Além disso,--soft
é o padrão, portanto, você pode omiti-lo se quiser e apenas dizergit reset HEAD~1
.zsh: no matches found: HEAD^
- você precisa escapar ^ iegit reset --soft HEAD\^
git commit -a
foi emitida quando-a
deveria ter sido deixada de fora. Nesse caso, é melhor não deixar de fora o--soft
(que resultará em--mixed
qual é o padrão) e, em seguida, você pode reorganizar as alterações que pretendia confirmar.git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…]
Desfazer um commit é um pouco assustador se você não sabe como ele funciona. Mas é realmente incrivelmente fácil se você entender.
Digamos que você tenha isso, onde C é sua CABEÇA e (F) é o estado de seus arquivos.
Você deseja remover o commit do C e nunca mais vê-lo e perder todas as alterações nos arquivos modificados localmente . Você faz isso:
O resultado é:
Agora B é a CABEÇA. Como você usou
--hard
, seus arquivos são redefinidos para seus estados na confirmação B.Ah, mas suponha que o commit C não tenha sido um desastre, mas apenas um pouco. Você deseja desfazer o commit, mas mantenha suas alterações um pouco para editar antes de fazer um commit melhor. Começando novamente a partir daqui, com C como sua CABEÇA:
Você pode fazer isso, deixando de fora o
--hard
:Nesse caso, o resultado é:
Nos dois casos, HEAD é apenas um ponteiro para o último commit. Quando você faz um
git reset HEAD~1
, você diz ao Git para mover o ponteiro HEAD de volta para um commit. Mas (a menos que você use--hard
), você deixa seus arquivos como estavam. Então agoragit status
, mostra as alterações que você registrou no C. Você não perdeu nada!Para dar um toque mais leve, você pode até desfazer seu commit, mas deixar seus arquivos e seu índice :
Isso não apenas deixa seus arquivos em paz, mas também deixa seu índice em paz. Ao fazê-lo
git status
, você verá que os mesmos arquivos estão no índice de antes. De fato, logo após esse comando, você poderia fazergit commit
e refazer o mesmo commit que acabou de ter.Mais uma coisa: suponha que você destrua um commit como no primeiro exemplo, mas depois descubra que precisava dele afinal ? Muita sorte, certo?
Não, ainda há uma maneira de recuperá-lo. Digite
git reflog
e você verá uma lista de commit (parcial) shas (ou seja, hashes) nos quais você se mudou. Encontre o commit que você destruiu e faça o seguinte:Agora você ressuscitou esse commit. As confirmações não são realmente destruídas no Git por cerca de 90 dias; portanto, você pode voltar e resgatar uma que você não queria se livrar.
fonte
git reset --hard~1
apontará a ramificação mestre para a última confirmação dentro da ramificação de recursos. Nesse caso, o ID de confirmação específico deve ser usado em vez do comando relativo.--hard
mas o que eu não percebi é que todas as minhas mudanças não organizadas na minha árvore de trabalho também são destruídas! Ia confirmar esses arquivos como parte de uma confirmação posterior. Agora parece impossível recuperar esses arquivos - eu até tentei a solução sobre a qual você postou,reflog
mas isso não restaurou as alterações anteriormente não apresentadas.Há duas maneiras de "desfazer" seu último commit, dependendo de você já ter tornado seu commit público ou não (enviado ao repositório remoto):
Como desfazer uma consolidação local
Digamos que eu confirmei localmente, mas agora quero remover esse commit.
Para restaurar tudo de volta ao estado anterior ao último commit, precisamos
reset
fazer o commit antesHEAD
:Agora
git log
mostrará que nosso último commit foi removido.Como desfazer um commit público
Se você já tornou seus commits públicos, convém criar um novo commit que "reverterá" as alterações feitas no commit anterior (HEAD atual).
Suas alterações agora serão revertidas e prontas para você confirmar:
Para obter mais informações, consulte Git Basics - Desfazendo coisas .
fonte
git revert HEAD^
não é o anterior, é o anterior do anterior. Eu fiz:git revert HEAD
e, em seguida, pressione novamente e funcionou :)Adicione / remova arquivos para obter as coisas da maneira que você deseja:
Em seguida, altere o commit:
A confirmação incorreta anterior será editada para refletir o novo estado do índice - em outras palavras, será como se você nunca tivesse cometido o erro.
Observe que você só deve fazer isso se não tiver pressionado ainda. Se você pressionou, precisará apenas fazer uma correção normalmente.
fonte
git rm --cached
para manter os arquivos no sistema de arquivos e excluí-los apenas do índice git!ou
Aviso: O comando acima removerá permanentemente as modificações no
.java
arquivos (e quaisquer outros arquivos) que você deseja confirmar.O
hard reset
toHEAD-1
definirá sua cópia de trabalho para o estado do commit antes do commit errado.fonte
git commit -a -m ""
ougit commit -am ""
naturalmente! :]git stash
, entãogit stash pop
Para alterar o último commit
Substitua os arquivos no índice:
Em seguida, se for um ramo privado, altere o commit:
Ou, se for um ramo compartilhado, faça um novo commit:
( Para alterar uma confirmação anterior , use a incrível re-interação interativa .)
ProTip ™: adicione
*.class
a um gitignore para impedir que isso aconteça novamente.Para reverter uma confirmação
Alterar uma confirmação é a solução ideal se você precisar alterar a última confirmação, mas uma solução mais geral é
reset
.Você pode redefinir o Git para qualquer confirmação com:
Onde
N
é o número de confirmações anterioresHEAD
e@~
redefine para a confirmação anterior.Portanto, em vez de alterar o commit, você pode usar:
Confira
git help reset
, especificamente as seções--soft
--mixed
e--hard
, para uma melhor compreensão do que isso faz.Reflogar
Se você errar, sempre poderá usar o reflog para encontrar confirmações descartadas:
fonte
git revert
é um comando separado - que basicamente 'redefine' um único comentário.Use
git revert <commit-id>
.Para obter o ID de confirmação, basta usar
git log
.fonte
git revert commit-id
funcionou como um encanto. Obviamente, você precisará fazer as alterações.git cherry-pick <<erroneous-commit-sha>>
@astronomerdave. De, Sr. Quase 2 Anos de Atraso no Partido.Se você está planejando desfazer um commit local completamente, o que quer que você tenha alterado no commit, e se você não se preocupa com nada, basta executar o seguinte comando.
(Este comando ignorará todo o commit e suas alterações serão perdidas completamente da sua árvore de trabalho local). Se você deseja desfazer sua consolidação, mas deseja suas alterações na área de preparação (antes da consolidação como depois
git add
), execute o seguinte comando.Agora seus arquivos confirmados entram na área de preparação. Suponha que, se você deseja substituir os arquivos, porque precisa editar algum conteúdo errado, execute o seguinte comando
Agora, os arquivos confirmados vêm da área preparada para a não preparada. Agora, os arquivos estão prontos para edição; portanto, o que você alterar, você deseja editar e adicioná-lo e fazer um novo / novo commit.
Mais
fonte
Se você tiver o Git Extras instalado, poderá executar
git undo
para desfazer a confirmação mais recente.git undo 3
desfaz os três últimos commits.fonte
Queria desfazer os cinco últimos commits em nosso repositório compartilhado. Procurei o ID da revisão para o qual eu queria reverter. Então digitei o seguinte.
fonte
Eu prefiro usar
git rebase -i
para este trabalho, porque uma boa lista aparece onde eu posso escolher os commits para me livrar. Pode não ser tão direto quanto outras respostas aqui, mas parece certo .Escolha quantas confirmações você deseja listar e, em seguida, chame assim (para inscrever as últimas três)
Lista de amostra
Em seguida, o Git removerá confirmações para qualquer linha que você remover.
fonte
Como corrigir a consolidação local anterior
Use git-gui (ou similar) para executar a
git commit --amend
. Na GUI, você pode adicionar ou remover arquivos individuais da confirmação. Você também pode modificar a mensagem de confirmação.Como desfazer a consolidação local anterior
Redefina sua ramificação para o local anterior (por exemplo, usando
gitk
ougit rebase
). Em seguida, aplique novamente as alterações a partir de uma cópia salva. Após a coleta de lixo em seu repositório local, será como se o commit indesejado nunca tivesse acontecido. Para fazer tudo isso em um único comando, usegit reset HEAD~1
.Aviso : O uso descuidado de
git reset
é uma boa maneira de colocar sua cópia de trabalho em um estado confuso. Eu recomendo que os novatos do Git evitem isso, se puderem.Como desfazer um commit público
Execute uma seleção reversa de cereja ( git-revert ) para desfazer as alterações.
Se você ainda não inseriu outras alterações em seu ramo, pode simplesmente fazer ...
Em seguida, envie sua ramificação atualizada para o repositório compartilhado.
O histórico de consolidação mostrará os dois commit, separadamente .
Avançado: Correção da ramificação privada no repositório público
Isso pode ser perigoso - verifique se você tem uma cópia local da ramificação para repush.
Observe também: você não deseja fazer isso se outra pessoa estiver trabalhando na ramificação.
Limpe sua filial localmente e repush ...
No caso normal, você provavelmente não precisa se preocupar com o histórico de confirmação de ramificação particular. Basta enviar um commit de acompanhamento (consulte 'Como desfazer um commit público' acima) e, posteriormente, fazer uma mescla de squash para ocultar o histórico.
fonte
gitk --all $(git reflog | cut -c1-7)&
pode ser útil para encontrar a revisão anterior se você quiser desfazer um commit '--amend'.git reset
git push origin (branch_name) --force
Se você deseja desfazê-lo permanentemente e clonou algum repositório
O ID de confirmação pode ser visto por
Então você pode fazer -
fonte
git reset --hard
, mas se você tem que remover duro últimos "n" commits você especificar um SHASe você cometeu lixo, mas não empurrou,
OU
fonte
HEAD~1
você, poderia usar o hash real, conforme exibidogit log --stat
porgit reflog
- útil quando você precisar 'desfazer' mais de um commit.No SourceTree (GUI para GitHub), você pode clicar com o botão direito do mouse no commit e fazer um 'Reverse Commit'. Isso deve desfazer suas alterações.
No terminal:
Como alternativa, você pode usar:
Ou:
fonte
Um único comando:
Funciona muito bem para desfazer o último commit local!
fonte
Basta redefini-lo usando o comando abaixo usando
git
:Explique: o que
git reset
faz, é basicamentereset
para qualquer confirmação que você gostaria de voltar e, se você combiná-la com a--soft
chave, ela voltará, mas mantenha as alterações no (s) seu (s) arquivo (s), para voltar ao estágio qual o arquivo que acabou de ser adicionado,HEAD
é o chefe do ramo e, se você combinar com~1
(neste caso, você também usaHEAD^
), ele retornará apenas um commit do que você deseja ...Crio as etapas da imagem abaixo em mais detalhes para você, incluindo todas as etapas que podem ocorrer em situações reais e confirmar o código:
fonte
Como desfazer o último commit do Git?
Para restaurar tudo de volta ao estado anterior ao último commit, precisamos redefinir o commit antes do HEAD.
Se você não deseja manter as alterações feitas:
Se você deseja manter suas alterações:
Agora verifique seu log do git. Isso mostrará que nosso último commit foi removido.
fonte
"Redefinir a árvore de trabalho para o último commit"
"Limpe arquivos desconhecidos da árvore de trabalho"
consulte - Referência Rápida do Git
NOTA: Este comando excluirá a confirmação anterior, portanto, use com cuidado!
git reset --hard
é mais seguro.fonte
Use reflog para encontrar um estado correto
REFLOG ANTES DE REINICIAR
Selecione o reflog correto (f3cb6e2 no meu caso) e digite
Depois disso, o repo HEAD será redefinido para o HEADid LOG AFTER RESET
Finalmente, o reflog se parece com a imagem abaixo
REFLOG FINAL
fonte
Primeira corrida:
Ele mostrará todas as ações possíveis que você executou no seu repositório, por exemplo, confirmar, mesclar, puxar, etc.
Então faça:
fonte
Desfazer a última confirmação:
git reset --soft HEAD^
ougit reset --soft HEAD~
Isso desfará o último commit.
Aqui
--soft
significa redefinir a preparação.HEAD~
ouHEAD^
significa mudar para confirmar antes de HEAD.Substitua a última confirmação por nova confirmação:
Ele substituirá o último commit pelo novo commit.
fonte
Outra maneira:
Faça o checkout da filial que você deseja reverter e, em seguida, redefina sua cópia de trabalho local de volta para a confirmação de que você deseja ser a mais recente no servidor remoto (tudo depois que ela se despedir). Para fazer isso, no SourceTree, clique com o botão direito do mouse e selecione "Redefinir BRANCHNAME para este commit".
Em seguida, navegue até o diretório local do seu repositório e execute este comando:
Isso apagará todas as confirmações após a atual em seu repositório local, mas apenas para essa ramificação.
fonte
Digite
git log
e localize o último código hash de confirmação e digite:fonte
No meu caso, cometi acidentalmente alguns arquivos que não queria. Então eu fiz o seguinte e funcionou:
Verifique os resultados com gitk ou git log --stat
fonte
Simples, execute isso na sua linha de comando:
fonte
Há muitas maneiras de fazer isso:
Comando Git para desfazer a última confirmação / confirmação anterior:
Aviso: Não use --hard se você não souber o que está fazendo. --hard é muito perigoso e pode excluir seus arquivos.
O comando básico para reverter a confirmação no Git é:
ou
COMMIT-ID : ID do commit
n: é o número das últimas confirmações que você deseja reverter
Você pode obter o ID de confirmação, como mostrado abaixo:
onde d81d3f1 e be20eb8 são id de confirmação.
Agora vamos ver alguns casos:
Suponha que você queira reverter o último commit 'd81d3f1'. Aqui estão duas opções:
ou
Suponha que você queira reverter o commit 'be20eb8':
Para informações mais detalhadas, você pode consultar e experimentar outros comandos também para redefinir a cabeça para um estado especificado:
fonte
git reset --hard HEAD~1
é muito perigoso ! Isso não apenas 'cancelará a última confirmação', mas reverterá completamente o repo para a confirmação anterior. Então você perderá todas as alterações confirmadas na última confirmação!git push -f <remote> HEAD@{1}:<branch>
Para uma confirmação local
ou se você não se lembrar exatamente em qual commit está, poderá usar
Para uma confirmação por push
A maneira correta de remover arquivos do histórico do repositório está usando
git filter-branch
. Isso é,Mas eu recomendo que você use esse comando com cuidado. Leia mais na página de manual do git-filter-branch (1) .
fonte
Existem dois cenários principais
Você ainda não enviou o commit
Se o problema foi com arquivos extras que você enviou (e não os deseja no repositório), é possível removê-los usando
git rm
e, em seguida, confirmando com--amend
Você também pode remover diretórios inteiros
-r
ou até mesmo combinar com outros comandos do BashApós remover os arquivos, você pode confirmar, com a opção --amend
Isso reescreverá sua confirmação local recente, removendo os arquivos extras. Portanto, esses arquivos nunca serão enviados por push e também serão removidos do GC pelo repositório local .git.
Você já enviou o commit
Você pode aplicar a mesma solução do outro cenário e seguir
git push
com a-f
opção, mas não é recomendado pois sobrescreve o histórico remoto com uma alteração divergente (pode atrapalhar o seu repositório).Em vez disso, você precisa fazer o commit sem
--amend
(lembre-se disso sobre -amend`: Essa opção reescreve o histórico no último commit).fonte
Para redefinir a revisão anterior, excluindo permanentemente todas as alterações não confirmadas:
fonte
--soft
para manter suas alterações comouncommitted changes
,--hard
para remover completamente o commit e reverter um por um. Lembre-se de executar essas operações apenas em alterações que ainda não foram enviadas.git reset --hard
.git
armazena seu conteúdo no banco de dados de objetos. O conteúdo armazenado é removido apenas quando a coleta de lixo é executada. Portanto, é possível recuperar a última versão em estágios de um arquivo que não estava atualmente em estágios quandogit reset --hard
foi executado (consulte as postagens vinculadas acima para obter mais informações).