¿Cómo rechazar cambios no especificados en Git?

¿Cómo deshago los cambios en mi copia de trabajo que no figuran en el índice?

3956
09 сент. Readonly set 09 sep. 2008-09-09 22:33 '08 a las 10:33 pm 2008-09-09 22:33
@ 32 respuestas
  • 1
  • 2

Otra forma rápida:

 git stash save --keep-index --include-untracked 

No es necesario incluir --include-untracked si no desea que se --include-untracked .

Después de eso, puedes restablecer este sello con el comando git stash drop si lo deseas.

2225
09 сент. respuesta dada por Greg Hewgill 09 de septiembre 2008-09-09 22:39 '08 a las 10:39 pm 2008-09-09 22:39

Para todos los archivos no instalados, use:

 git checkout -- . 

Para un uso específico del archivo:

border=0
 git checkout path/to/file/to/revert 

Asegúrese de especificar el período al final.

4303
09 сент. La respuesta se da Tobi 09 sep. 2008-09-09 22:37 '08 a las 10:37 pm 2008-09-09 22:37

Parece que la solución completa:

 git clean -df git checkout -- . 

git clean elimina todos los archivos no procesados ​​( advertencia ), mientras que no elimina los archivos ignorados mencionados directamente en .gitignore, puede eliminar los archivos ignorados en las carpetas ), y git checkout borra todos los cambios no especificados.

1643
29 авг. Respuesta dada por Mariusz Nowak el 29 de agosto. 2012-08-29 21:28 '12 a las 21:28 2012-08-29 21:28

Esto comprueba el índice actual del directorio actual, descartando todos los cambios en los archivos del directorio actual hacia abajo.

 git checkout . 

o esto, que verifica todos los archivos del índice, sobrescribiendo los archivos de trabajo del árbol.

 git checkout-index -a -f 
283
20 июня '09 в 13:28 2009-06-20 13:28 CB Bailey da la respuesta el 20 de junio de 2009 a las 13:28 2009-06-20 13:28
 git clean -df 

Limpia el árbol de trabajo al eliminar recursivamente los archivos que no están bajo el control de versiones, comenzando por el directorio actual.

-d : elimina directorios innecesarios además de archivos sin rastro

-f : Fuerza (puede no ser necesario dependiendo de la configuración de clean.requireForce )

Ejecute git help clean para ver el tutorial.

218
07 дек. Respuesta dada por Elvis Ciotti 07 de diciembre 2011-12-07 16:09 '11 a las 16:09 2011-12-07 16:09

Mi favorito

 git checkout -p 

Esto le permite devolver piezas selectivamente.

Ver tambien

 git add -p 
85
10 окт. respuesta dada Ben 10 de octubre 2014-10-10 15:31 '14 a las 15:31 2014-10-10 15:31

Como ninguna respuesta ofrece una variante exacta de la combinación que utilizo, aquí está:

 git clean -dfx git checkout . 

Este es el texto de ayuda en línea para las opciones de git clean utilizadas:

-d

Eliminar directorios innecesarios, además de los archivos en bruto. Si un directorio sin firmar es administrado por otro repositorio Git, no se elimina de forma predeterminada. Utilice la opción -f dos veces si realmente desea eliminar dicho directorio.

-f

Si la variable de configuración de Git clean.requireForce no se establece en false , Git clean se negará a eliminar archivos o directorios a menos que -i especifique -f , -n o -i . Git se negará a eliminar directorios en un subdirectorio o archivo .git si no es -f segundo -f .

-x

No use las reglas de ignorar de .gitignore (para cada directorio) y $GIT_DIR/info/exclude , pero siga usando las reglas de ignorar especificadas con las opciones -e . Esto le permite eliminar todos los archivos sin procesar, incluido el ensamblaje de productos. Esto se puede usar (posiblemente junto con git reset ) para crear un directorio de trabajo intacto para verificar una compilación limpia.

Además, git checkout. Debe ejecutarse en la raíz del repositorio.

68
28 апр. Respuesta dada por Martin G 28 de abril. 2016-04-28 22:46 '16 a las 10:46 pm 2016-04-28 22:46

De hecho, encontré este artículo útil para explicar cuándo usar qué comando: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

Hay varios casos diferentes:

  • Si no pusiste el archivo, usa git checkout . Checkout "actualiza los archivos en el árbol de trabajo según la versión en el índice". Si los archivos no se entregaron (también se agregaron al índice) ... este comando esencialmente devolverá los archivos a lo que fue su última solución.

    git checkout -- foo.txt

  • Si pones el archivo, usa git reset. Restablecer cambia el índice de acuerdo con la corrección.

    git reset -- foo.txt

Sospecho que usar git stash es una opción popular, ya que es un poco menos peligroso. Siempre puedes volver a él si accidentalmente borras demasiado al usar git reset. El reinicio es recursivo por defecto.

Echa un vistazo al artículo de arriba para obtener más consejos.

53
14 авг. La respuesta se da blak3r 14 de agosto. 2012-08-14 00:31 '12 a las 0:31 2012-08-14 00:31

La forma más fácil de hacer esto es usar este comando:

Este comando se usa para deshacer cambios en el directorio de trabajo -

 git checkout -- . 

https://git-scm.com/docs/git-checkout

En el comando git, pegar archivos en bruto se logra utilizando:

 git stash -u 

http://git-scm.com/docs/git-stash

45
12 апр. Responder AHM Forhadul Islam 12 de abril 2017-04-12 12:27 '17 a las 12:27 2017-04-12 12:27

Si no está interesado en guardar cambios no especificados (especialmente si los cambios en fases son archivos nuevos), lo encontré conveniente:

 git diff | git apply --reverse 
41
28 июля '11 в 8:27 2011-07-28 08:27 Joshua Kunzmann dio la respuesta el 28 de julio de 2011 a las 8:27 2011-07-28 08:27

Al ingresar al estado de git (use "git checkout -..." para descartar los cambios en el directorio de trabajo) .

por ejemplo git checkout -- .

39
17 мая '16 в 14:27 2016-05-17 14:27 Erdem ÖZDEMİR dio la respuesta el 17 de mayo de 2016 a las 14:27 2016-05-17 14:27

git checkout -f


man git-checkout :

-f, --force

Al cambiar de rama, continúe trabajando, incluso si el índice o el árbol de trabajo es diferente de HEAD. Esto se utiliza para eliminar los cambios locales.

Al verificar las rutas desde el índice, no falle para las entradas no autorizadas; en su lugar, las entradas ignoradas se ignoran.

38
17 мая '14 в 5:28 2014-05-17 05:28 La respuesta se da Bijan 17 de mayo, 14 a las 5:28 2014-05-17 05:28

Puede usar git stash: si algo sale mal, aún puede regresar de su billetera. Como otra respuesta aquí, pero esta también elimina todos los archivos desinstalados, así como todas las eliminaciones desinstaladas:

 git add . git stash 

Si comprueba que todo está bien, suelte el caché:

 git stash drop 

La respuesta de Bilal Maqsood utilizando git clean también funcionó para mí, pero con la aplicación tengo más control: si accidentalmente hago esto, todavía puedo devolver mis cambios.

ACTUALIZACIÓN

Creo que hay otro cambio (no sé por qué funcionó antes para mí):

git add . -A git add . -A lugar de git add .

sin -A los archivos eliminados no serán colocados

33
11 сент. La respuesta se da Asped 11 de septiembre. 2015-09-11 14:59 '15 a las 2:59 pm 2015-09-11 14:59

En lugar de descartar los cambios, reinicio mi consola al principio. Nota Este método está diseñado para restaurar completamente su carpeta usando repo.

Por lo tanto, hago esto para asegurarme de que no estén sentados allí cuando git reset (más adelante - excluye gitignores en Origen / nombre de sucursal)

NOTA. Si desea que los archivos no sean rastreados todavía, pero no en GITIGNORE, puede omitir este paso, ya que destruirá estos archivos no fósiles que no se encuentran en el repositorio remoto (gracias a @XtrmJosh).

 git add --all 

Entonces yo

 git fetch --all 

Entonces reinicio al principio

 git reset --hard origin/branchname 

Esto lo devolverá a la plaza. Al igual que al volver a clonar una rama, al mismo tiempo, guardar todos mis archivos gitignored localmente y en su lugar.

Actualizado al comentario del usuario a continuación: Cambiar para restablecer para cualquier rama actual en la que el usuario esté habilitado.

 git reset --hard @{u} 
31
08 авг. La respuesta la da Nick 08 ago. 2015-08-08 00:15 '15 a las 0:15 2015-08-08 00:15

Si solo desea eliminar los cambios en los archivos existentes , use checkout ( documentado aquí ).

 git checkout -- . 
  • No se especifica ninguna rama, por lo que comprueba la rama actual.
  • El guión doble ( -- ) le dice a Geeta que se debe tomar lo siguiente para su segundo argumento (ruta), que se perdió la especificación de la rama.
  • Período ( . ) Indica todos los caminos.

Si desea eliminar los archivos agregados desde la última confirmación, use clean ( documentado aquí ):

 git clean -i 
  • La -i inicia una clean interactiva para evitar eliminaciones erróneas.
  • Hay varias otras opciones disponibles para una ejecución más rápida; Consulte la documentación.

Si desea mover los cambios al espacio de almacenamiento para un acceso posterior , use el stash ( documentado aquí ):

 git stash 
  • Todos los cambios se transferirán a Git Stash para un posible acceso posterior.
  • Hay varias opciones disponibles para un mejor ocultamiento; Consulte la documentación.
25
18 марта '18 в 3:19 2018-03-18 03:19 La respuesta la da jtheletter el 18 de marzo de '18 a las 3:19 ; 2018-03-18 03:19

Probé todas las soluciones anteriores, pero aún no pude deshacerme de los nuevos archivos desinstalados.

Utilice git clean -f para eliminar estos nuevos archivos, ¡con cuidado! Preste atención al parámetro de potencia.

25
15 окт. respuesta dada por artur 15 de octubre 2011-10-15 00:07 '11 a las 0:07 2011-10-15 00:07

solo di

 git stash 

Se eliminarán todos los cambios locales. También puedes usar más tarde diciendo

 git stash apply 

o git stash pop

20
24 апр. respuesta dada por piyushmandovra el 24 de abril 2015-04-24 15:19 '15 a las 15:19 2015-04-24 15:19

Sólo usa:

 git stash -u 

Esta hecho Fácil

Si realmente te importa tu pila de fichas, puedes seguir con el git stash drop . Pero en este momento es mejor que uses (de Mariusz Nowak):

 git checkout -- . git clean -df 

Sin embargo, me gusta más git stash -u , porque "descarta" todos los cambios rastreados y no probados en un solo comando. Todavía git checkout -- . solo descarta los cambios rastreados, y git clean -df solo descarta los cambios git clean -df ... e ingresar ambos comandos es demasiado trabajo :)

20
08 сент. Respuesta dada por Ben Wilde Sep 08 2016-09-08 09:19 '16 a las 9:19 2016-09-08 09:19

Incluso funciona en directorios; fuera de los permisos normales de git.

 sudo chmod -R 664 ./*  git checkout -- .  git clean -dfx 

Sucedió recientemente

16
05 сент. La respuesta la da GlassGhost el 5 de septiembre. 2013-09-05 12:38 '13 a las 12:38 2013-09-05 12:38
 cd path_to_project_folder # take you to your project folder/working directory git checkout . # removes all unstaged changes in working directory 
14
30 мая '14 в 12:26 2014-05-30 12:26 la respuesta es dada vivekporwal04 30 de mayo, 14 a las 12:26 2014-05-30 12:26

No importa en qué estado se encuentre su repo, siempre puede restablecer todas las reparaciones anteriores:

 git reset --hard <commit hash> 

Esto deshará todos los cambios que se hicieron después de esta confirmación.

10
05 февр. La respuesta se da msangel 05 feb . 2016-02-05 03:59 '16 a las 3:59 2016-02-05 03:59

Otra forma de deshacerse de los archivos nuevos que son más específicos que git clean -df (le permitirá deshacerse de algunos archivos, no necesariamente todos) es agregar primero nuevos archivos al índice, luego esconderlos y luego eliminar el caché.

Este método es útil cuando, por algún motivo, no puede eliminar fácilmente todos los archivos en bruto por algún mecanismo ordinario (por ejemplo, rm).

10
15 июня '12 в 11:55 2012-06-15 11:55 la respuesta se da tjb 15 de junio de 2012 a las 11:55 2012-06-15 11:55

En mi opinion

 git clean -df 

Tengo que hacer el truco. Según git clean git documentación.

git -clean - elimina archivos no procesados ​​del árbol de trabajo

Descripción

Limpia el árbol de trabajo al eliminar recursivamente los archivos que no están bajo el control de versiones, comenzando por el directorio actual.

Por lo general, solo se eliminan los archivos desconocidos para git, pero si se usa la opción -x, los archivos también se ignoran. Esto puede, por ejemplo, ser útil para eliminar todos los productos de ensamblaje.

Si se dan argumentos opcionales ... solo se verán afectadas esas rutas.

Opciones

-d Eliminar directorios innecesarios además de archivos sin rastro. Si el directorio sin firmar es administrado por otro repositorio de git, no se elimina de forma predeterminada. Utilice la opción -f dos veces si realmente desea eliminar dicho directorio.

-f --force Si la variable de configuración git clean.requireForce no está configurada como falsa, git clean rechazará el inicio si no se especifica -f, -n o -i.

9
14 июля '16 в 10:03 2016-07-14 10:03 La respuesta se da a Lahiru el 14 de julio de 2016 a las 10:03 2016-07-14 10:03

Lo que sigue es realmente solo una solución si trabaja con el conector del repositorio, donde se sincroniza regularmente (por ejemplo, una solicitud de transferencia) con otro repositorio. La respuesta corta es: retire el tenedor y vuelva a armar, pero lea las advertencias de github .

Tuve un problema similar, quizás no idéntico, y lamento decir que mi solución no es la ideal, pero al final es efectiva.

A menudo tendría mensajes de estado de git como este (que involucran al menos 2/4 archivos):

 $ git status # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats # modified: doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats # modified: doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats 

El ojo atento se dará cuenta de que hay dopplegangers en estos archivos, que son la única letra en el caso de apagado. De todos modos, y no tengo idea de lo que me llevó a esta ruta de inicio (ya que no trabajé con estos archivos desde el repositorio ascendente), cambié estos archivos. Pruebe las muchas soluciones enumeradas en esta página (y otras páginas) que no parecieron ayudar.

Pude solucionar el problema eliminando mi repositorio ramificado y todos los repositorios locales y regresando. Eso solo no era suficiente; upstream debería haber cambiado el nombre de los archivos en cuestión a nuevos nombres de archivo. Siempre y cuando no tengas ningún trabajo roto, no hay wiki ni problemas que divergan desde el repositorio hacia arriba, deberías estar bien. Como mínimo, Upstream puede no estar muy contento contigo. En cuanto a mi problema, este es sin duda un error del usuario, ya que no tengo esta experiencia con git, pero el hecho de que no sea fácil de solucionar indica un problema con git.

9
05 янв. La respuesta es dada por bbarker 05 jan. 2014-01-05 07:53 '14 a las 7:53 AM 2014-01-05 07:53

Si desea transferir un cheque a otra persona:

 # add files git add . # diff all the changes to a file git diff --staged > ~/mijn-fix.diff # remove local changes git reset  git checkout . # (later you can re-apply the diff:) git apply ~/mijn-fix.diff 

[editar] como se comentó, se pueden llamar escondites. Bueno, usa esto si quieres compartir tu billetera;)

7
08 июля '13 в 18:07 2013-07-08 18:07 La respuesta se da dos veces en julio 08 '13 a las 18:07 2013-07-08 18:07

Si todos los archivos paso a paso fueron realmente reparados, entonces la rama puede ser solo un restablecimiento, por ejemplo. desde su GUI con tres clics del ratón: Vetka , Restablecer , ¡ !

Por lo tanto, lo que a menudo hago en la práctica para deshacer cambios locales no deseados es transferir todas las cosas buenas y luego restablecer la rama.

Si se solucionan las cosas buenas en una confirmación, entonces puede usar "cambiar última confirmación" para devolverla a la configuración o inestable si desea que sea un poco diferente al final.

Puede que esta no sea la solución técnica que busca para su problema, pero creo que es una solución muy práctica. Esto le permite deshacer selectivamente los cambios inestables, restablecer los cambios que no le gustan y guardar los que realice.

Así que acabo de confirmar , resetear la rama y cambiar la última confirmación .

6
20 марта '15 в 18:38 2015-03-20 18:38 la respuesta la da el usuario 3070485, 20 de marzo de 2015 a las 18:38 2015-03-20 18:38

Puede crear su propio alias que describa cómo hacer esto de manera descriptiva.

Uso el siguiente apodo para descartar los cambios.


Descartar cambios a (listar) archivo (s) en el árbol de trabajo

 discard = checkout -- 

Luego puedes usarlo para borrar todos los cambios:

 discard . 

O simplemente un archivo:

 discard filename 

De lo contrario, si desea deshacer todos los cambios, así como los archivos no utilizados, utilizo una combinación de verificación y limpieza:

Borre y descarte los cambios y no haga un seguimiento de los archivos en el árbol de trabajo

 cleanout = !git clean -df  git checkout -- . 

Por lo tanto, el uso es simple:

 cleanout 

Ahora disponible en el siguiente repositorio de Github, que contiene muchos alias:

5
05 июня '17 в 7:44 2017-06-05 07:44 La respuesta es dada por Pau el 5 de junio de '17 a las 7:44 2017-06-05 07:44

Ninguna de las soluciones funciona si acaba de cambiar los permisos de archivo (esto es en DOS / Windoze)

 Mon 23/11 / 2015-15: 16: 34.80 C: \ ... \ work \ checkout \ slf4j +> git status En la rama SLF4J_1.5.3 Cambios no preparados para cometer:   (use "git add ..." para actualizar lo que se confirmará)   (use "git checkout - ..." para descartar los cambios en el directorio de trabajo) modificado: .gitignore modificado: LICENCIA.txt modificado: TODO.txt modificado: codeStyle.xml modificado: pom.xml modificado: version.pl no se agregaron cambios al commit (use "git add" y / o "git commit -a") Lunes 23/11 / 2015-15: 16: 37.87 C: \ ... \ work \ checkout \ slf4j +> git diff diff --git a / .gitignore b / .gitignore modo antiguo 100644 nuevo modo 100755 diff --git a / LICENSE.txt b / LICENSE.txt modo antiguo 100644 nuevo modo 100755 diff --git a / TODO.txt b / TODO.txt modo antiguo 100644 nuevo modo 100755 diff --git a / codeStyle.xml b / codeStyle.xml modo antiguo 100644 nuevo modo 100755 diff --git a / pom.xml b / pom.xml modo antiguo 100644 nuevo modo 100755 diff --git a / version.pl b / version.pl modo antiguo 100644 nuevo modo 100755 Mon 23/11 / 2015-15: 16: 45.22 C: \ ... \ work \ checkout \ slf4j +> git reset --hard HEAD HEAD ahora está en 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Agregado .gitignore Lunes 23/11 / 2015-15: 16: 47.42 C: \ ... \ work \ checkout \ slf4j +> git clean -f Mon 23/11 / 2015-15: 16: 53.49 C: \ ... \ work \ checkout \ slf4j +> git stash save -u Directorio de trabajo guardado e estado del índice WIP en SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Añadido .gitignore HEAD ahora está en 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Agregado .gitignore Mon 23/11 / 2015-15: 17: 00.40 C: \ ... \ work \ checkout \ slf4j +> git stash drop Eliminados refs / stash @ {0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd) Mon 23/11 / 2015-15: 17: 06.75 C: \ ... \ work \ checkout \ slf4j +> git stash drop Eliminados refs / stash @ {0} (e6c49c470f433ce344e305c5b778e810625d0529) Mon 23/11 / 2015-15: 17: 08.90 C: \ ... \ work \ checkout \ slf4j +> git stash drop No se encontró ningún alijo. Mon 23/11 / 2015-15: 17: 15.21 C: \ ... \ work \ checkout \ slf4j +> git checkout -. Mon 23/11 / 2015-15: 22: 00.68 C: \ ... \ work \ checkout \ slf4j +> git checkout -f -. Mon 23/11 / 2015-15: 22: 04.53 C: \ ... \ work \ checkout \ slf4j +> git status En la rama SLF4J_1.5.3 Cambios no preparados para cometer:   (use "git add ..." para actualizar lo que se confirmará)   (use "git checkout - ..." para descartar los cambios en el directorio de trabajo) modificado: .gitignore modificado: LICENCIA.txt modificado: TODO.txt modificado: codeStyle.xml modificado: pom.xml modificado: version.pl no se agregaron cambios al commit (use "git add" y / o "git commit -a") Lunes 23/11 / 2015-15: 22: 13.06 C: \ ... \ work \ checkout \ slf4j +> git diff diff --git a / .gitignore b / .gitignore modo antiguo 100644 nuevo modo 100755 diff --git a / LICENSE.txt b / LICENSE.txt modo antiguo 100644 nuevo modo 100755 diff --git a / TODO.txt b / TODO.txt modo antiguo 100644 nuevo modo 100755 diff --git a / codeStyle.xml b / codeStyle.xml modo antiguo 100644 nuevo modo 100755 diff --git a / pom.xml b / pom.xml modo antiguo 100644 nuevo modo 100755 diff --git a / version.pl b / version.pl modo antiguo 100644 nuevo modo 100755

La única forma de solucionar este problema es restablecer manualmente los permisos en los archivos modificados:

 Mon 23/11 / 2015-15: 25: 43.79 C: \ ... \ work \ checkout \ slf4j +> git status -s |  egrep "^ M" |  corte -c4- |  para / f "usebackq tokens = * delims ="% A in (`more`) do chmod 644% ~ A Mon 23/11 / 2015-15: 25: 55.37 C: \ ... \ work \ checkout \ slf4j +> git status En la rama SLF4J_1.5.3 No hay nada que cometer, trabajando en el directorio limpio. Lunes 23/11 / 2015-15: 25: 59.28 C: \ ... \ work \ checkout \ slf4j +> Lunes 23/11 / 2015-15: 26: 31.12 C: \ ... \ work \ checkout \ slf4j +> git diff
5
23 нояб. La respuesta es dada por Malcolm Boekhoff el 23 de noviembre. 2015-11-23 07:30 '15 a las 7:30 2015-11-23 07:30

Si está en el caso de un submódulo, y ninguna otra solución funciona, intente:

  • Para verificar cuál es el problema (posiblemente el caso sucio), use:

    git diff

  • Para eliminar texto oculto

    git submodule update

5
02 окт. La respuesta se da onalbi 02 oct. 2015-10-02 00:32 '15 a las 0:32 2015-10-02 00:32

Tuve una situación extraña cuando siempre faltaba el archivo, me ayuda a resolverlo.

git rm.gitattributes
git añadir -A
git reset - hard

5
08 февр. La respuesta se da SDV 08 Feb. 2017-02-08 14:58 '17 a las 2:58 pm 2017-02-08 14:58
  • 1
  • 2

Otras preguntas sobre la etiqueta de o hacer una pregunta