Tengo un repositorio que tiene dos archivos que supuestamente cambié localmente.
Así que estoy atrapado con esto:
$ git status
# On branch master
# 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: dir1/foo.aspx
# modified: dir2/foo.aspx
#
no changes added to commit (use "git add" and/or "git commit -a")
Doing git diff
dice que todo el contenido del archivo ha cambiado, a pesar de que parece falso (parece haber rangos de línea comunes que diff parece no ver).
Curiosamente, no recuerdo haber cambiado estos archivos localmente. Este repositorio se usa con un repositorio remoto (privado, en GitHub.com, FWIW).
No importa lo que haya intentado, no puedo descartar estos cambios locales. He probado todos:
$ git checkout -- .
$ git checkout -f
$ git checkout -- dir1/checkout_receipt.aspx
$ git reset --hard HEAD
$ git stash save --keep-index && git stash drop
$ git checkout-index -a -f
En otras palabras, probé todo lo que se describe en ¿Cómo descarto los cambios sin etapas en Git? y mucho más. Pero los 2 archivos permanecen bloqueados como "cambiado pero no confirmado".
¿Qué diablos causaría que dos archivos se atasquen de esta manera y aparentemente "deshagan la tabla de reversión"?
PD En la lista anterior que muestra los comandos que ya había probado, escribí por error git revert
cuando quise decir git checkout
. Lo siento y gracias a aquellos de ustedes que respondieron que debería intentarlo checkout
. Edité la pregunta para corregirla. Definitivamente ya lo intenté checkout
.
git diff --ignore-space-change
ogit diff --ignore-all-space
hace una diferencia en la salida degit diff
?git diff
dice que los archivos son idénticos.git config --global core.autocrlf false
lugar de "verdadero".Respuestas:
¿Cuáles son los finales de línea en los archivos? Apuesto a que son CRLF. Si es así, consulte esta guía: http://help.github.com/line-endings/
En resumen, debe asegurarse de que git esté configurado para convertir los finales de línea a LF en la confirmación y luego confirmar esos archivos. Los archivos en el repositorio siempre deben ser LF, los archivos extraídos deben ser nativos del sistema operativo, asumiendo que configuró git correctamente.
fuente
git config --global core.autocrlf true
y también lo hace la otra parte presionando al repositorio en GitHub.<pre>
bloque de esa guía para arreglar los archivos en el repositorio.Pasé horas tratando de resolver un problema similar: una rama remota que había verificado, que obstinadamente mostraba cuatro archivos como 'Cambiados pero no actualizados', ¡incluso al eliminar todos los archivos y ejecutarlos
git checkout -f
nuevamente (u otras variaciones de esta publicación)!Estos cuatro archivos eran necesarios, pero ciertamente yo no los había modificado. Mi solución final: convencer a Git de que no se han cambiado. Lo siguiente funciona para todos los archivos extraídos, mostrando el estado 'modificado' - ¡asegúrese de haber confirmado / escondido alguno que realmente haya sido modificado !:
En Mac OSX, sin embargo, xargs funciona un poco diferente (gracias a Daniel por el comentario):
Agregué esto como un marcador de posición para mí la próxima vez, pero espero que también ayude a alguien más.
-Alabama
fuente
git ls-files -m | xargs -I {} git update-index --assume-unchanged {}
git ls-files -v|grep '^h' | cut -c3- | xargs -i git update-index --no-assume-unchanged "{}"
assume-unchaged
, como en el caso de @ RodH257. Creo que la respuesta correcta la mayor para el caso en comandos comogit checkout -- file
,git stash
ygit reset --hard HEAD
no funcionan es, como ya se ha contestado, la edición.gitattributes
así es como solucioné el mismo problema en mi caso: cambio .gitattributes abierto:
a:
guardar y cerrar, luego revertir o restablecer, gracias a @Simon East por la pista
fuente
text=auto
configuración en .gitattributes funcionó para mí, y luego, después de que yogit reset --hard
, volví a colocar esa configuración, ¡los archivos ya no se mostraban como modificados!text=auto
configuración. Estoy trabajando en repositorios con confirmaciones de varios sistemas operativos y todavía no he descubierto qué me causa más problemas: mantenerlo o eliminarlo.Otra posibilidad es que la diferencia (que le impide revertir estos archivos con un comando de pago) es el modo de archivo. Esto es lo que me pasó. En mi versión de git puedes descubrir esto usando
Y le mostrará los cambios de modo de archivo. Sin embargo, todavía no le permitirá revertirlos. Para ese uso ya sea
o cambie su git .config en su editor de texto agregando
Después de hacer esto, puede usar
y el archivo debería desaparecer.
(Obtuve todo esto de la respuesta a ¿Cómo hago que git ignore los cambios de modo (chmod)? )
fuente
core.filemode
ya estaba configurado como falso). En mi caso, la solución / solución alternativa fue la de la respuesta de Alan Forsyth .Intente revertir los cambios locales :
fuente
checkout
. Ya lo intentécheckout
. Gracias de todos modos por tu respuesta. Fue una buena respuesta a mi pregunta original, así que votaré a favor.Tenía algunos archivos modificados fantasma que se mostraban como modificados, pero en realidad eran idénticos.
Ejecutar este comando a veces funciona:
(Desactiva las conversiones de final de línea "inteligentes" pero a menudo inútiles de git)
Pero en otro caso descubrí que se debía a un
.gitattributes
archivo en la raíz que tenía algunas configuraciones de final de línea presentes, que intentaba aplicarautocrlf
para ciertos archivos incluso cuando estaba apagado. Eso no fue realmente útil, así que eliminé.gitattributes
, comprometí y el archivo ya no se mostró como modificado.fuente
text=auto
configuración en .gitattributes funcionó para mí, y luego, después de que yogit reset --hard
, volví a colocar esa configuración, ¡los archivos ya no se mostraban como modificados!fuente
checkout
. Ya lo intentécheckout
. Gracias de todos modos por tu respuesta. Fue una buena respuesta a mi pregunta original, así que votaré a favor.También puede haber tenido un problema relacionado con los directorios que nombran mayúsculas y minúsculas. Algunos de sus colegas podrían haber cambiado el nombre del directorio de, por ejemplo, myHandler a MyHandler . Si luego empujó y extrajo algunos de los archivos del directorio original, habría tenido 2 directorios separados en el repositorio remoto Y solo uno en su máquina local, ya que en Windows solo puede tener uno. Y estás en problemas.
Para verificar si ese es el caso, solo vea si el repositorio remoto tiene una estructura doble.
Para solucionar este problema, haga una copia de seguridad del directorio principal fuera del repositorio, luego elimine el directorio principal y empújelo. Haga un tirón (aquí es cuando el segundo marcado como eliminado debería aparecer en el estado) y presione nuevamente. Después de eso, vuelva a crear toda la estructura a partir de su copia de seguridad y vuelva a introducir los cambios.
fuente
Creo que sería útil proporcionar una pista sobre cómo reproducir el problema para comprender mejor el problema:
Segunda forma de reproducir: En el script anterior, reemplace esta línea:
echo "*.txt -text" > .gitattributes
con
git config core.autocrlf=false
y mantenga el resto de las líneas como está
¿Qué dicen todos los anteriores? Un archivo de texto puede (bajo algunas circunstancias) ser comprometido con CRLF, (por ejemplo,
-text
en.gitattributes
/ ocore.autocrlf=false
).Cuando luego queramos tratar el mismo archivo como texto (
-text
->text
), será necesario confirmarlo nuevamente.Por supuesto, puede revertirlo temporalmente (como respondió correctamente Abu Assar ). En nuestro caso:
La respuesta es : ¿realmente quieres hacer eso? Porque causará el mismo problema cada vez que cambies el archivo.
Para el registro:
Para verificar qué archivos pueden causar este problema en su repositorio, ejecute el siguiente comando (git debe compilarse con --with-libpcre):
Al comprometer el (los) archivo (s) (suponiendo que quiera tratarlos como texto), es lo mismo que hacer lo que se propone en este enlace http://help.github.com/line-endings/ para solucionar dichos problemas . Pero, en lugar de eliminar
.git/index
y ejecutarreset
, puede simplemente cambiar los archivos, luego ejecutargit checkout -- xyz zyf
y luego confirmar.fuente
Tuve el mismo problema, con la interesante adición de que los archivos se cambiaron en Windows, pero no al mirarlos desde WSL. Ninguna cantidad de juegos con finales de línea, reinicios, etc. pudo cambiarlo.
Finalmente, encontré una solución en esta respuesta . A continuación se muestra el texto de conveniencia:
He resuelto este problema siguiendo los siguientes pasos
1) Elimina todos los archivos del índice de Git.
2) Vuelva a escribir el índice de Git para recoger todos los nuevos finales de línea.
La solución fue parte de los pasos descritos en el sitio de git https://help.github.com/articles/dealing-with-line-endings/
fuente
Para mí, el problema no se trataba de finales de línea. Se trataba de cambiar mayúsculas y minúsculas en el nombre de la carpeta (Reset_password -> Reset_Password). Esta solución me ayudó: https://stackoverflow.com/a/34919019/1328513
fuente
Este problema también puede deberse a que git trata las diferencias de mayúsculas como archivos diferentes, pero Windows los trata como el mismo archivo. Si el nombre de un archivo solo cambia las mayúsculas, todos los usuarios de Windows de ese repositorio terminarán en esta situación.
La solución es confirmar que el contenido de los archivos es correcto y luego volver a enviarlo. Tuvimos que fusionar el contenido de los dos archivos ya que eran diferentes. Luego tire y habrá un conflicto de fusión que puede resolver eliminando el archivo duplicado. Vuelva a enviar la resolución de combinación y volverá a un estado estable.
fuente