¿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
Jacques René Mesrine
fuente

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
1800 INFORMACIÓN
fuente
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.

Antony Stubbs
fuente
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
William Entriken
fuente
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.
Michael Durrant
fuente
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
William Pursell
fuente
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
Tobias Gassmann
fuente
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.

Scott Davey
fuente
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 
piyushmandovra
fuente
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.

Patricio
fuente
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.

Manohar Reddy Poreddy
fuente
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` 
jbooker
fuente
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
Janderson Silva
fuente
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

TarmoPikaro
fuente