¿Cómo revierto todos los cambios locales en el proyecto administrado por Git al estado anterior?


1914

Tengo un proyecto en el que corrí git init. Después de varias confirmaciones, hice lo git statusque me dijo que todo estaba actualizado y que no había cambios locales.

Luego hice varios cambios consecutivos y me di cuenta de que quería tirar todo y volver a mi estado original. ¿Este comando lo hará por mí?

git reset --hard HEAD

Respuestas:


3390

Si desea revertir los cambios realizados en su copia de trabajo, haga lo siguiente:

git checkout .

Si desea revertir los cambios realizados en el índice (es decir, que ha agregado), haga esto. ¡Advertencia, esto restablecerá todas tus confirmaciones no apresuradas para dominar! :

git reset

Si desea revertir un cambio que ha cometido, haga lo siguiente:

git revert <commit 1> <commit 2>

Si desea eliminar archivos sin seguimiento (por ejemplo, archivos nuevos, archivos generados):

git clean -f

O directorios no rastreados (por ejemplo, directorios nuevos o generados automáticamente):

git clean -fd

133
después de tanto tiempo, git checkout path/to/filesolo revertirá los cambios locales apath/to/file
Matijs

29
+1 en las respuestas a continuación también menciona git clean -f (para eliminar los cambios no rastreados) y -fd (también para eliminar directorios no
rastreados

3
y si también desea limpiar sus archivos no rastreados, lea este stackoverflow.com/questions/61212/…
Surasin Tancharoen

99
git checkout .y git reset [--hard HEAD]no funcionó, tuve que hacer un git clean -fdpara revertir mis cambios.
BrainSlugs83

77
git resetno restablece tus cambios, git reset --hardhace eso.
Cerin

388

Nota: es posible que también desee ejecutar

git clean -fd

como

git reset --hard

será no eliminar archivos sin seguimiento, donde como git-limpio se eliminarán todos los archivos del directorio raíz orugas que no están bajo el seguimiento de git. ADVERTENCIA: ¡TENGA CUIDADO CON ESTO! Es útil ejecutar primero una ejecución en seco con git-clean, para ver qué eliminará.

Esto también es especialmente útil cuando recibe el mensaje de error

~"performing this command will cause an un-tracked file to be overwritten"

Lo que puede ocurrir al hacer varias cosas, una es actualizar una copia de trabajo cuando usted y su amigo han agregado un nuevo archivo con el mismo nombre, pero él lo ha confiado primero en el control de origen y no le importa eliminar su copia no rastreada .

En esta situación, hacer una ejecución en seco también ayudará a mostrarle una lista de archivos que se sobrescribirán.


13
El comando de limpieza de archivos es "git clean -f". Los directorios sin seguimiento se eliminan con "git clean -d"
Jonathan Mitchell

35
git clean -fd (se requiere fuerza para -d)
electblake

14
-n o --dry-run son las banderas para la ejecución en seco.
stephenbez

2
git clean -ffd si tiene otro repositorio git en su repositorio git. Sin doble f no se eliminaría.
Trismegistos

149

Re-clonar

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • ✅ Elimina confirmaciones locales no enviadas
  • ✅ Revierte los cambios realizados en archivos rastreados
  • ✅ Restaura los archivos rastreados que eliminó
  • ✅ Elimina archivos / directorios listados en .gitignore(como archivos de compilación)
  • ✅ Elimina archivos / directorios que no se rastrean y no están en .gitignore
  • 😀 No olvidarás este enfoque
  • 😔 desperdicia ancho de banda

Los siguientes son otros comandos que olvido a diario.

Limpiar y reiniciar

git clean --force -d -x
git reset --hard
  • ❌ Elimina confirmaciones locales no enviadas
  • ✅ Revierte los cambios realizados en archivos rastreados
  • ✅ Restaura los archivos rastreados que eliminó
  • ✅ Elimina archivos / directorios listados en .gitignore(como archivos de compilación)
  • ✅ Elimina archivos / directorios que no se rastrean y no están en .gitignore

Limpiar

git clean --force -d -x
  • ❌ Elimina confirmaciones locales no enviadas
  • ❌ Revierte los cambios realizados en archivos rastreados
  • ❌ Restaura los archivos rastreados que eliminó
  • ✅ Elimina archivos / directorios listados en .gitignore(como archivos de compilación)
  • ✅ Elimina archivos / directorios que no se rastrean y no están en .gitignore

Reiniciar

git reset --hard
  • ❌ Elimina confirmaciones locales no enviadas
  • ✅ Revierte los cambios realizados en archivos rastreados
  • ✅ Restaura los archivos rastreados que eliminó
  • ❌ Elimina archivos / directorios listados en .gitignore(como archivos de compilación)
  • ❌ Elimina archivos / directorios que no se rastrean y no están en .gitignore

Notas

Caso de prueba para confirmar todo lo anterior (use bash o sh):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

Ver también

  • git revert para hacer nuevos compromisos que deshacen los compromisos anteriores
  • git checkout retroceder en el tiempo a confirmaciones anteriores (puede requerir ejecutar primero los comandos anteriores)
  • git stashigual que el git resetanterior, pero puedes deshacerlo

Perdón por robar las respuestas anteriores. Uso esta referencia constantemente, publicando principalmente para mí.
William Entriken

1
Estoy bastante seguro de que la primera opción ( volver a clonar ) realmente "elimina las confirmaciones locales no empujadas" :)
Marandil

1
@styfle ✅ es algo que hace, ❌ es algo que no hace
William Entriken

3
@FullDecent Es un poco confuso de leer. "❌ NO elimina las confirmaciones locales no empujadas". Eso significa que NO se elimina. ¿El doble negativo significa que borra?
styfle

1
Acerca del indicador -x en git clean -f -d -x: si se especifica la opción -x, los archivos ignorados también se eliminan. Esto puede, por ejemplo, ser útil para eliminar todos los productos de compilación.- de los documentos de GIT
Alex

82

Si desea revertir todos los cambios Y estar actualizado con el maestro remoto actual (por ejemplo, encuentra que el HEAD maestro ha avanzado desde que se bifurcó y su empuje está siendo 'rechazado') puede usar

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

Parece importante especificar originen git reset --hard origin/master(que funciona) - sin él (es decir git reset --hard) nada parece haber cambiado.
Jake

He tenido algunos cambios locales y no es capaz de deshacerse de ellos por cualquier comando que hice git restablecer --hard origen / maestra y era capaz de cambios de maestría tirón así
ringsia Abhishek

50

Mira en git-reflog. Enumerará todos los estados que recuerda (el valor predeterminado es 30 días), y puede simplemente retirar el que desee. Por ejemplo:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

muchas gracias William, por git reflog. Restablezco mi árbol a la versión anterior y no estoy seguro de cómo volver a la versión reciente. Tu reflog de git me salvó. Gracias una vez más.
palaniraja

1
¡También me salvó! En mi caso, mi aventura git rebase -ihabía salido mal (terminó borrando algunas confirmaciones debido a un error de edición). Gracias a este consejo, he vuelto a estar en buen estado.
paneer_tikka

¿Qué quieres decir con 30 días por defecto?
Mohe TheDreamy

@MoheTheDreamy Quiero decir que hay un límite de tiempo. Finalmente, el recolector de basura eliminará las referencias inalcanzables cuando su edad supere ese límite. El valor predeterminado solía ser (y tal vez todavía es) 30 días. Por lo tanto, las referencias anteriores pueden no estar disponibles.
William Pursell

36

PELIGRO ADELANTE: (lea los comentarios. Ejecutar el comando propuesto en mi respuesta podría eliminar más de lo que desea)

para eliminar completamente todos los archivos, incluidos los directorios que tuve que ejecutar

git clean -f -d

13
Para salvar a cualquiera el dolor que acabo de pasar: ¡esto también eliminará los archivos .gitignore-d!
aterriza el

lo siento si te causé algún problema. En aquel entonces, solo intenté revertir y eliminar todo en esa carpeta. No recuerdo las circunstancias exactas, pero el "-d" fue lo único que funcionó para mí. Espero no haberte causado demasiado dolor :-)
Tobias Gassmann

1
ningún daño hecho. Tenía copias de seguridad, pero esto probablemente justifica un descargo de responsabilidad;)
aterriza el

35

Después de leer un montón de respuestas y probarlas, he encontrado varios casos extremos que a veces no limpian completamente la copia de trabajo.

Aquí está mi script de bash actual para hacerlo, que funciona todo el tiempo.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Ejecutar desde el directorio raíz de la copia de trabajo.


10
El último comando me daerror: pathspec 'HEAD' did not match any file(s) known to git.
0xC0000022L

1
Funcionó para mí cuando saqué el "-". git checkout HEAD
Bufón

44
git reset --hardrevierte los archivos rastreados (por etapas o no), git clean -f -delimina los archivos no rastreados , git checkout -- HEAD¿por qué necesitamos esto entonces?
v.shashenko

No necesitamos el guión doble. Debe ser un error tipográfico.
Farax

35

simplemente ejecute

git stash

eliminará todos tus cambios locales. y también puedes usarlo más tarde ejecutando -

git stash apply 

3
el uso git stash popeliminaría automáticamente el cambio oculto más alto para usted
Arrow Cen

8
git stash droppara eliminar el último estado oculto sin aplicar a la copia de trabajo.
ciervo

git stash apply no agregará archivos recién creados
Ravistm

27

Me encontré con un problema similar. La solución es usar git logpara buscar qué versión de la confirmación local es diferente de la remota. (Por ejemplo, la versión es3c74a11530697214cbcc4b7b98bf7a65952a34ec ).

Luego use git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ecpara revertir el cambio.


16

Busqué un problema similar,

Quería tirar los compromisos locales:

  1. clonado el repositorio (git clone)
  2. cambiado a rama de desarrollo (git checkout dev)
  3. hizo pocas confirmaciones (git commit -m "commit 1")
  4. pero decidió descartar estos commits locales para volver a remotos (origin / dev)

También lo hizo a continuación:

git reset --hard origin/dev

Cheque:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

ahora se pierden las confirmaciones locales, de vuelta al estado clonado inicial, punto 1 anterior.


1
gracias, eso es lo único que funcionó para mí - "git reset - hard origin"
Nisim Naim

feliz de saber que ayudó.
Manohar Reddy Poreddy

7

Es posible que no necesariamente desee / necesite guardar su trabajo / archivos en su directorio de trabajo, sino simplemente deshacerse de ellos por completo. El comandogit clean hará esto por ti.

Algunos casos de uso comunes para hacer esto serían eliminar cruft generado por fusiones o herramientas externas o eliminar otros archivos para que pueda ejecutar una compilación limpia.

Tenga en cuenta que querrá ser muy cauteloso con este comando, ya que está diseñado para eliminar archivos de su directorio de trabajo local que NO ESTÁN SEGUIDOS. si de repente cambia de opinión después de ejecutar este comando, no hay vuelta atrás para ver el contenido de los archivos que se eliminaron. Una alternativa más segura es ejecutar

git stash --all

que eliminará todo pero lo guardará todo en un alijo. Este alijo puede luego ser utilizado.

Sin embargo, si realmente desea eliminar todos los archivos y limpiar su directorio de trabajo, debe ejecutar

git clean -f -d

Esto eliminará cualquier archivo y también cualquier subdirectorio que no tenga ningún elemento como resultado del comando. Una cosa inteligente que hacer antes de ejecutar el git clean -f -dcomando es ejecutar

git clean -f -d -n

que le mostrará una vista previa de lo que se eliminará después de ejecutar git clean -f -d

Aquí hay un resumen de sus opciones, desde la más agresiva hasta la menos agresiva


Opción 1 : eliminar todos los archivos localmente (más agresivo)

git clean -f -d

Opción 2 : Vista previa del impacto anterior (Vista previa más agresiva)

git clean -f -d -n

Opción 3 : ocultar todos los archivos (menos agresivo)

`git stash --all` 

6

Pruebe esto para revertir todos los cambios no confirmados en la sucursal local

$ git reset --hard HEAD

Pero si ves un error como este:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

Puede navegar a la carpeta '.git' y luego eliminar el archivo index.lock:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Finalmente, ejecute nuevamente el comando:

$ git reset --hard HEAD

0

Esta pregunta es más sobre restablecer / revertir un repositorio más amplio, pero en caso de que esté interesado en revertir el cambio individual, he agregado una respuesta similar aquí:

https://stackoverflow.com/a/60890371/2338477

Respuestas a preguntas:

  • Cómo revertir el cambio individual con o sin cambio conservando en el historial de git

  • Cómo volver a la versión anterior para reiniciar desde el mismo estado

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.