Como desfazer um pull git?

238

Gostaria de desfazer o meu git pull por conta de confirmações indesejadas na origem remota, mas não sei para qual revisão devo redefinir.

Como posso voltar ao estado antes de executar o git na origem remota?

Kartins
fonte
4
Nota lateral: você pode achar que é útil git fetch upstreamem primeiro lugar, em seguida, tomar um rápido olhar git diff upstream/branchpara ver o que você vai fundir em Se tudo estiver bem, então prosseguir com.git merge upstream/branch
Shahbaz
1
Você perderá todo o seu credito na rua e receberá uma semana de pagamento se algum programador moderno o ver executar comandos git a partir de uma GUI, mas o GitHub Desktop e o Atom possuem botões simples e seguros para undoconfirmar e marcar caixas de seleção, para fácil e claramente exibir e desestabilizar arquivos. GUIs também são pessoas!
Dem Pilafian

Respostas:

391

Ou, para torná-lo mais explícito do que a outra resposta:

git pull 

gritos?

git reset --keep HEAD@{1}

Versões do git anteriores a 1.7.1 não possuem --keep. Se você usar essa versão, poderá usar --hard- mas essa é uma operação perigosa, pois perde as alterações locais.


Para o comentarista

ORIG_HEAD é o estado anterior do HEAD, definido por comandos que têm um comportamento possivelmente perigoso, para facilitar a reversão. Agora é menos útil que o Git tenha reflog: HEAD @ {1} é aproximadamente equivalente a ORIG_HEAD (HEAD @ {1} é sempre o último valor de HEAD, ORIG_HEAD é o último valor de HEAD antes de operações perigosas)

ver
fonte
2
qual é a diferença entre HEAD @ {1} e HEAD ^?
Hugemeow 28/08/12
7
@ hugemeow Essa seria uma ótima pergunta para SO. Enquanto isso man git-rev-parsedescreve isso. HEAD@{1}é o valor anterior de simbólico HEADno reflogconsiderando que HEAD^é a (primeira) revisão pai da corrente HEAD. Esses dois precisam ser equivalentes (por exemplo, depois de uma nova atualização, uma reinicialização total, uma troca de ramificação e outras coisas). Leia o artigo vinculado para reflog. Cheers
veja 28/08/12
10
Usuários do PowerShell, escapem dos suportes com um bastão:git reset HEAD@`{1`}
Robert Claypool
3
ss64.com/ps/syntax-esc.html Acho que você quis digitar HEAD@`{1`}ou, nesse caso, faça o que funciona também com os shells POSIX:'HEAD@{1}'
veja
2
Eu acho que não apenas redefinir o pull, mas também meus commits = (
falsarella 24/04
67

git reflog showdeve mostrar a história do HEAD. Você pode usar isso para descobrir onde você estava antes do pull. Então você pode fazer o resetseu HEADcommit.

Noufal Ibrahim
fonte
O git reflog show forneceu esta saída: c9e5e4d HEAD @ {0}: pull: avanço rápido 1c86a22 HEAD @ {1}: pull master de origem: avanço 05c141a HEAD @ {2}: pull: avanço rápido Posso redefinir com segurança o HEAD para HEAD @ {1}
Kartins 28/04/11
A outra resposta de sehe tem detalhes sobre como chegar lá.
Noufal Ibrahim
Isso foi super útil depois que um commit desastroso, de alguma forma, intercalou os commits em minha história. Faça isso procurando um último bem conhecido no reflog e depois force o empurrão.
Domenic
E se pullfor a primeira ação? Se pullestá em HEAD@{1}, e nada mais antes disso, como você volta a um estado antes disso?
Hendra Uzia
Recriar o repositório?
Noufal Ibrahim 17/07/2013
29

Isso funcionou para mim.

git reset --hard ORIG_HEAD 

Desfazer uma mesclagem ou pull:

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)

Faça o checkout disso: HEAD e ORIG_HEAD no Git para obter mais informações.

Parag Tyagi
fonte
17

Encontre o <SHA#>para o commit que você deseja ir. Você pode encontrá-lo no github ou digitando git logou git reflog showna linha de comando e depois git reset --hard <SHA#>

Nina
fonte
Encontre o que para o commit?
Martin
Desculpe, eu consertei isso<SHA#>
Nina
Este é o comando que eu uso mais quando eu tenho que desfazer algo
Kartins
2

De https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadirtyworkingtree

Desfazer uma mesclagem ou puxar para dentro de uma árvore de trabalho suja

$ git pull           (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol               |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)

Mesmo que você tenha modificações locais em sua árvore de trabalho, pode dizer com segurança git pullquando souber que a alteração na outra ramificação não se sobrepõe a elas.

Após inspecionar o resultado da mesclagem, você pode achar que a alteração na outra ramificação não é satisfatória. A execução git reset --hard ORIG_HEAD permitirá que você volte para onde estava, mas descartará as alterações locais, que você não deseja. git reset --mergemantém suas alterações locais.

Consulte também https://stackoverflow.com/a/30345382/621690

Risadinha
fonte
Obrigado! Você salvou meu dia
Thiago Martins