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?


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)


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.


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.


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


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


Obrigado! Você salvou meu dia
— Thiago Martins
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.