Pregunta ¿Cómo revertir todos los cambios locales en el proyecto administrado de Git al estado anterior?


Tengo un proyecto en el que corrí git init. Después de varias confirmaciones, lo hice git status que me dijo que todo estaba actualizado y que no hubo 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

1544
2017-07-18 07:52


origen


Respuestas:


Si desea revertir los cambios realizados a su copia de trabajo, haga esto:

git checkout .

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

git reset

Si desea revertir un cambio que haya cometido, haga esto:

git revert <commit 1> <commit 2>

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

git clean -f

O directorios sin seguimiento (por ejemplo, directorios nuevos o generados automáticamente):

git clean -fd

2808
2017-07-18 07:57



Nota: Es posible que también desee ejecutar

git clean -fd

como

git reset --hard

será no elimine los archivos no rastreados, mientras que git-clean eliminará cualquier archivo del directorio raíz rastreado que no esté bajo el seguimiento de git. ADVERTENCIA - ¡TEN CUIDADO CON ESTO! Es útil ejecutar una ejecución en seco con git-clean primero, para ver qué se eliminará.

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

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

Lo cual puede ocurrir al hacer varias cosas, una de ellas es actualizar una copia de trabajo cuando usted y su amigo agregaron un nuevo archivo con el mismo nombre, pero primero lo envió al control de código fuente y no le importa borrar su copia no rastreada. .

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


334
2017-07-20 05:37



Si desea revertir todos los cambios Y actualizarse con el maestro remoto actual (por ejemplo, si encuentra que el HEAD maestro se movió hacia adelante desde que se bifurcó y su impulso 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.

58
2018-04-22 20:48



Mire en git-reflog. Enumerará todos los estados que recuerda (el valor predeterminado es 30 días), y usted puede simplemente seleccionar el que desea. 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

47
2017-07-19 12:16



Re-clonar

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  ¿Elimina las confirmaciones locales, no empujadas?
  •  Revierte los cambios que hizo en los archivos rastreados
  •  Restaura los archivos rastreados que eliminaste
  •  Elimina archivos / directorios listados en .gitignore (como archivos de compilación)
  •  Elimina archivos / directorios que no son rastreados y que no están en .gitignore
  •  No olvidará este enfoque
  •  Ancho de banda de desechos

Los siguientes son otros comandos que me olvido a diario.

Limpiar y restablecer

git clean -f -d -x
git reset --hard
  •  NO elimina las confirmaciones locales, no empujadas
  •  Revierte los cambios que hizo en los archivos rastreados
  •  Restaura los archivos rastreados que eliminaste
  •  Elimina archivos / directorios listados en .gitignore (como archivos de compilación)
  •  Elimina archivos / directorios que no son rastreados y que no están en .gitignore

Limpiar

git clean -f -d -x
  •  NO elimina las confirmaciones locales, no empujadas
  •  NO revierte los cambios realizados en los archivos rastreados
  •  NO restaura los archivos rastreados que eliminaste
  •  Elimina archivos / directorios listados en .gitignore (como archivos de compilación)
  •  Elimina archivos / directorios que no son rastreados y que no están en .gitignore

Reiniciar

git reset --hard
  •  NO elimina las confirmaciones locales, no empujadas
  •  Revierte los cambios que hizo en los archivos rastreados
  •  Restaura los archivos rastreados que eliminaste
  •  Elimina archivos / directorios listados en .gitignore (como archivos de compilación)
  •  NO borra archivos / directorios que no son rastreados 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 nuevas confirmaciones que deshagan las confirmaciones previas
  • git checkout para retroceder en el tiempo a compromisos previos (puede requerir ejecutar primero los comandos)
  • git stash igual que git reset arriba, pero puedes deshacerlo

40
2018-03-20 12:37



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

para eliminar por completo todos los archivos, incluidos los directorios que tenía que ejecutar

git clean -f -d

34
2017-09-11 07:10



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

Aquí está mi script 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.


34
2018-06-04 07:25



simplemente di

git stash

eliminará todos tus chages locales. y también puedes usarlo más tarde al decir

git stash apply 

29
2018-04-24 12:18



Me encontré con un problema similar. La solución es usar git log para buscar qué versión de la confirmación local es diferente del control remoto. (Por ejemplo, la versión es 3c74a11530697214cbcc4b7b98bf7a65952a34ec)

Entonces usa git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec para revertir el cambio


26
2017-08-28 07:34



Es posible que no necesariamente desee / necesite esconder su trabajo / archivos en su directorio de trabajo, sino simplemente deshacerse de ellos por completo. El comando git clean Hará esto por ti.

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

Tenga en cuenta que querrá tener mucho cuidado con este comando, ya que está diseñado para eliminar archivos de su directorio de trabajo local que NO están SEGUIDOS. Si cambias repentinamente de opinión después de ejecutar este comando, no hay marcha atrás para ver el contenido de los archivos que se eliminaron. Una alternativa que es más segura es ejecutar

git stash --all 

que eliminará todo pero lo guardará todo en un escondite. 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 -d comando es ejecutar

git clean -f -d -n

que le mostrará una vista previa de lo que se eliminará después de la ejecución git clean -f -d

Aquí hay un resumen de sus opciones, desde las más agresivas a las menos agresivas


Opción 1: Eliminar todos los archivos localmente (Más agresivo)

git clean -f -d

opcion 2: Vista previa del impacto anterior (Vista previa más agresiva)

git clean -f -d -n

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

`git stash --all` 

6
2018-06-14 22:31



Busqué un problema similar,

Quería descartar compromisos locales:

  1. clonado el repositorio (clon git)
  2. cambiado a la rama dev (git checkout dev)
  3. cometió pocos commits (git commit -m "commit 1")
  4. pero decidió descartar estos commits locales para volver a remote (origin / dev)

También lo hizo a continuación:

git reset --hard origin/dev

Comprobar:

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, volviendo al estado clonado inicial, punto 1 anterior.


6
2018-02-25 10:03