¿Cómo deshacer un git pull?

238

Me gustaría deshacer mi git pull a causa de confirmaciones no deseadas en el origen remoto, pero no sé a qué revisión debo restablecer.

¿Cómo puedo volver al estado antes de hacer el git pull en el origen remoto?

Kartins
fuente
44
Nota al margen: puede que le resulte útil git fetch upstreamprimero, luego eche un vistazo rápido git diff upstream/branchpara ver en qué se fusionará. Si todo está bien, continúe congit merge upstream/branch
Shahbaz
1
Perderá toda su credibilidad en la calle y recibirá una paga de una semana si algún programador hipster lo ve hacer comandos git desde una GUI, pero tanto GitHub Desktop como Atom tienen botones seguros y directos para undoconfirmar y casillas de verificación para organizar y eliminar archivos de manera fácil y clara. ¡Las GUI también son personas!
Dem Pilafian

Respuestas:

391

O para hacerlo más explícito que la otra respuesta:

git pull 

whoops?

git reset --keep HEAD@{1}

Las versiones de git anteriores a 1.7.1 no tienen --keep. Si usa dicha versión, podría usarla --hard, pero es una operación peligrosa porque pierde cualquier cambio local.


Al comentarista

ORIG_HEAD es el estado anterior de HEAD, establecido por comandos que tienen un comportamiento posiblemente peligroso, para que sea fácil revertirlos. Es menos útil ahora que Git tiene reflog: HEAD @ {1} es aproximadamente equivalente a ORIG_HEAD (HEAD @ {1} siempre es el último valor de HEAD, ORIG_HEAD es el último valor de HEAD antes de una operación peligrosa)

sehe
fuente
2
¿Cuál es la diferencia entre HEAD @ {1} y HEAD ^?
hugemeow
77
@hugemeow Esa sería una buena pregunta SO. Mientras tanto man git-rev-parsedescribe esto. HEAD@{1}es el valor anterior de simbólico HEADen el reflogmientras que HEAD^es la (primera) revisión principal de la actual HEAD. Estos dos deben ser equivalentes (por ejemplo, después de un rebase, un restablecimiento completo, un cambio de rama y esas cosas). Lea el artículo vinculado para reflog. Saludos
sehe
10
Usuarios de PowerShell, escapen de los corchetes con un backtick:git reset HEAD@`{1`}
Robert Claypool
3
ss64.com/ps/syntax-esc.html Creo que ha querido escribir HEAD@`{1`}, o incluso hacer lo que funciona en shells POSIX:'HEAD@{1}'
sehe
2
Creo que no solo restablece la extracción, sino también mis commits = (
falsarella
67

git reflog showdebería mostrarte la historia de HEAD. Puedes usar eso para descubrir dónde estabas antes del pull. Entonces puedes resettu HEADa ese compromiso.

Noufal Ibrahim
fuente
git reflog show dio este resultado: c9e5e4d HEAD @ {0}: pull: avance rápido 1c86a22 HEAD @ {1}: pull origin master: avance rápido 05c141a HEAD @ {2}: pull: avance rápido ¿Puedo restablecer el HEAD a HEAD de manera segura? @ {1}
Kartins
La otra respuesta de sehe tiene detalles sobre cómo llegar allí.
Noufal Ibrahim
Esto fue súper útil después de que una confirmación desastrosa de alguna manera interfiriera en mi historia. Los saqué buscando un último bien conocido en el registro y luego forcé a empujar.
Domenic
¿Qué pasa si pulles la primera acción? Si pullestá en HEAD@{1}, y nada más antes de eso, ¿cómo volver a un estado anterior?
Hendra Uzia
Recrea el repositorio?
Noufal Ibrahim
29

Esto funcionó para mí.

git reset --hard ORIG_HEAD 

Deshacer una fusión o extracción:

$ 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)

Mira esto: HEAD y ORIG_HEAD en Git para más.

Parag Tyagi
fuente
17

Encuentra el <SHA#>compromiso para el que quieres ir. Puede encontrarlo en github o escribiendo git logo git reflog showen la línea de comando y luego hacer git reset --hard <SHA#>

Nina
fuente
¿Encontrar el qué para el compromiso?
Martin
Lo siento, arreglé eso<SHA#>
Nina
Este es el comando que más uso cuando tengo que deshacer algo
Kartins
2

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

Deshacer una fusión o tirar dentro de un árbol de trabajo sucio

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

Incluso si puede tener modificaciones locales en su árbol de trabajo, puede decir con seguridad git pullcuando sepa que el cambio en la otra rama no se superpone con ellas.

Después de inspeccionar el resultado de la fusión, es posible que el cambio en la otra rama no sea satisfactorio. La ejecución git reset --hard ORIG_HEAD le permitirá volver a donde estaba, pero descartará los cambios locales que no desea. git reset --mergemantiene tus cambios locales.

Ver también https://stackoverflow.com/a/30345382/621690

Risadinha
fuente
¡Gracias! Me salvaste el día
Thiago Martins