Parece que no se pueden descartar los cambios en Git

124

Después de ver lo siguiente desde la línea de comando:

# On branch RB_3.0.10
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.htm

Estoy tratando de descartar mis cambios escribiendo el comando:

git checkout -- index.htm

pero cuando vuelvo a ejecutar el estado de git, se ve exactamente igual. El pago no parece estar funcionando. ¿Estoy haciendo algo mal? Estoy usando GIT 1.6.1.2 en windows / cygwin.

# On branch RB_3.0.10
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.htm
Eyal
fuente
44
¿ git checkout HEAD -- index.htmFunciona (salir del último estado comprometido, en lugar de salir del índice)?
Jakub Narębski el
3
git checkout HEAD -- index.htm¡trabajó para mi!
Ben Tideswell

Respuestas:

52

Esto me ha estado molestando por un tiempo, casi todos los repositorios que revisé tenían cambios que no pude descartar. En pocas palabras, probé todo lo anterior, nada funcionó. Esto es lo que hice para que las cosas vuelvan a la normalidad (en una Mac):

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard
Frank Martin
fuente
77
Después de probar todo lo anterior, esto fue lo único que funcionó para mí (en Windows)
Anders
¡Gracias! Igual que Anders dijo, esta solución también funciona para mí. Reemplacé autocrlf con # autocrlf
David
37

Aquí está mi experiencia, establezca las siguientes variables en .git/config:

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

luego corre $ git checkout HEAD ., y funciona. pero $ git checkout -- .no extraño!

* git versión 1.9.3

Nianliang
fuente
35

¿Qué cambios se git diffmuestran en el archivo? En Windows, he visto problemas con los finales de línea que causan problemas como este. En ese caso, mira qué configuraciones tienes para git config core.autocrlfy git config core.safecrlf. Hay alguna documentación para esta configuración aquí .

Yo diría que si está utilizando git svnpara la integración con Subversion, asegúrese de que autocrlfesté apagado. Por lo que puedo decir, simplemente se rompe en esta configuración y hace que la mayoría de las herramientas piensen que los archivos han cambiado, cuando ha realizado una checkoutpara revertir cualquier cambio.

Si está viendo un problema donde lo hace git checkout, y luego git statusmuestra que el archivo todavía está modificado, y git diffmuestra que el archivo está modificado en cada línea del archivo, entonces este es el problema que está viendo.

core.autocrlf

Si es verdadero, hace que git convierta CRLF al final de las líneas en archivos de texto a LF al leer desde el sistema de archivos, y convierta a la inversa al escribir en el sistema de archivos. La variable se puede configurar como entrada, en cuyo caso la conversión ocurre solo mientras se lee del sistema de archivos, pero los archivos se escriben con LF al final de las líneas. Actualmente, qué rutas considerar "texto" (es decir, someterse al mecanismo de autocrlf) se decide únicamente en función de los contenidos.

core.safecrlf

Si es verdadero, hace que git verifique si la conversión de CRLF controlada por core.autocrlf es reversible. Git verificará si un comando modifica un archivo en el árbol de trabajo, ya sea directa o indirectamente. Por ejemplo, confirmar un archivo seguido de verificar el mismo archivo debería producir el archivo original en el árbol de trabajo. Si este no es el caso para la configuración actual de core.autocrlf, git rechazará el archivo. La variable se puede establecer en "advertir", en cuyo caso git solo avisará sobre una conversión irreversible pero continuará la operación. ...

1800 INFORMACIÓN
fuente
core.autocrlf = true core.safecrlf no se ha establecido. ¿Debería establecerse esto en verdadero para Windows? Cuál es la diferencia entre los dos?
Yo diría, déjelos apagados SI está usando git svn. Agregué algunos detalles más.
1800 INFORMACIÓN
44
Supongo que quiere decir
rotarlo
2
Cuando configuré core.autocrlf y core.safecrlf en verdadero, pude descartar los cambios detectados en los archivos ofensivos ejecutando 'git reset --hard HEAD'.
Aleksey
19

Creo que necesitas pasar -f

Desde la página de manual ( man git-checkout, GIT-CHECKOUT (1)):

-f, --force
Continuar incluso si el índice o el árbol de trabajo difieren de HEAD.
Esto se usa para descartar cambios locales .

Por ejemplo, descarte los cambios en la rama actual y cambie a una rama diferente:

git checkout -f master
Hasen
fuente
77
Pase -f a qué? Sería bueno completar la respuesta
PandaWood
@ Matt, mi intención no era pagar una sucursal diferente. La respuesta es de 2009, así que realmente no recuerdo, pero a juzgar por la pregunta, creo que tenía la intención de pasar -fa la salida - <nombre de archivo> como engit checkout -f -- filename
hasen
@hasen Los tres comentarios que tenía pedían aclaraciones, por eso agregué el "por ejemplo". El ejemplo no excluye otros usos de-f
Matt H
Trabajó para mi. git checkout -f masterlanzó "Ya en 'maestro'" pero los cambios se habían ido.
Cristiano
11

Es posible que se trate de terminaciones de línea, como sugiere @ 1800-information, pero otra posibilidad es que la diferencia (que evita que revierta estos archivos con un comando de pago) es uno de los modos de archivo. Esto es lo que me pasó a mí. En mi versión de git puedes descubrir esto usando

git diff index.htm

Y le mostrará los cambios en el modo de archivo. Sin embargo, aún no le permitirá revertirlos, utilizando el pago, incluso con la opción -f. Para ese uso ya sea

git config core.filemode false

o cambie su git .config en su editor de texto agregando

[núcleo]

filemode = false

Después de hacer esto, puedes usar

git reset HEAD index.htm

y el archivo debería desaparecer.

(Obtuve todo esto de las respuestas a ¿Cómo hago que git ignore los cambios de modo (chmod)? Y la actualización de permisos de archivo solo en git )

Eyal
fuente
6

¿Estás en OSX o Windows? Si es así, el problema probablemente sea tener dos archivos del mismo nombre, con mayúsculas y minúsculas. p.ej. index.htm e Index.htm

Windows, y de manera predeterminada OSX, utiliza un sistema de archivos que no distingue entre mayúsculas y minúsculas, lo que entra en conflicto con el git sensible a mayúsculas y minúsculas.

Fil
fuente
2

Tuve este problema y después de probar todo lo anterior, nada funcionó.

Lo que funcionó para mí fue eliminar el directorio en el que estaba el archivo, luego lo hizo git statusy se aseguró de que todos los archivos en ese directorio ahora estén marcados como eliminados. Después de eso simplemente lo hice git checkout -fy todo volvió a la normalidad.

Eldar
fuente
1

Estaba trabajando en un libGDXproyecto Android Studioy quería descartar todos los cambios que he hecho, y nada funcionaba para mí, la solución que se me ocurrió fue comprometer todos los cambios en una nueva sucursal

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

y luego puede eliminar la TRASHrama si lo desea.

Waqleh
fuente
1

Tuve el mismo problema, nada de los comentarios anteriores funcionó. Resultó que mi sistema de archivos no distingue entre mayúsculas y minúsculas (valor predeterminado de osx, pero Windows probablemente se comporta igual) y un archivo estaba presente con mayúsculas y minúsculas en el mismo directorio, con contenido diferente. Como en mi computadora ambos nombres apuntaban al mismo archivo, el estado de git siempre mostraba una modificación, sin importar lo que hiciera. Para resolver el problema:

  • Tuve que eliminar uno de los archivos de otra computadora y empujarlo para repositorio

  • eliminar toda la versión local por completo

  • hacer clon git desde cero

joe
fuente
0

He tenido un problema similar, en el que no me permitía descartar archivos que no existen o se han cambiado. Utilizo Visual Studio en el trabajo, y descubrí que esto sucede al cambiar de rama mientras la aplicación se está ejecutando.

git checkoute intentar descartarlo no ayudó. No funcionaría o simplemente me diría que no tengo permiso.

Solución que funcionó:

  1. Entra en modo seguro
  2. Descartar archivos

Reiniciar es un dolor, pero esto funcionó más rápido que probar 100 cosas.

Gene Parcellano
fuente
0

Hay una solución fácil. Si esto sucede (normalmente debido al apagado inesperado de Windows o al volcado de memoria) y no puede descartar sus cambios e incluso cambiar de rama (Git dice que no tiene suficiente permiso); en Windowsentorno show all hidden files and foldersde opciones de carpeta. Vaya a su directorio GIT (debe comenzar con .git) y elimine el "index.lock"archivo. Entonces Git debería dejarte hacer lo que quieras hacer.

Mahib
fuente
0

Terminé haciendo un git stashseguido de un git stash cleanpara deshacerme de algunos. No vi ninguna configuración automática de cr / lf en .git / o ~ / .git.

Matt H
fuente
0

En mi caso, no pude descartar los cambios relacionados con un directorio. por ejemplo, cuando ejecuté un git diff, vería esto: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

Entonces llamé a ese directorio y ejecuté un estado git allí. Estaba en un estado separado de la CABEZA. Y luego acabo de correr un git checkout masterallí. Eso me arregló las cosas. Pero esto no es útil para el escenario exacto solicitado aquí.

Sheetal Kaul
fuente
0

Esta es una vieja pregunta, pero aún era relevante para mí. No encontré mi respuesta hasta preguntar por la oficina y descubrí que el problema estaba en los submódulos. Cuando se actualizan, y su propio repositorio no refleja esos cambios, aparece con diferencias, restablecer la cabeza no ayuda. Si este es el caso, ejecute:

git status update

Eso debería ayudar a arreglar las cosas (en este caso particular)

Bradley Robinson
fuente
0

Tuve un problema de permisos en Windows y tuve que hacerlo icacls containingFolder /reset /t /l /cy luego hacer doble clic en la carpeta para recuperar mis permisos.

Noumenon
fuente
0

Tenía .gitattributes con el siguiente contenido:

* text=auto eol=lf

Para superar el problema, edite .gitattributespara eliminar esta línea que relaja las terminaciones de línea. Luego git reset --hard HEADrevirtió los archivos y el .gitattributesarchivo.

James Jithin
fuente
0

Para mí, este problema surgió con una combinación de descarga de una imagen Git-LFS que se cargó a través de Netlify CMS y que su manejador Netlify Large Media le sirvió de manera diferente.

Mi solución fue comentar / eliminar estas filas de mi ~/.gitconfigpara que se vean a continuación, y luego verificar git statusnuevamente.

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

O probablemente pueda agregar un filtro más local a través de a .gitconfigen la raíz del repositorio y de alguna manera sobrescribir las reglas de filtro para lfs allí.

Espero que esto ayude a un compañero.

Knogobert
fuente
-1

También enfrenté un problema similar y los siguientes pasos me ayudaron:

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

Espero que ayude a otras personas también.

Atin Agarwal
fuente