not - Git: ¿Cómo revertir 2 archivos obstinados en "Modificado pero no confirmado"?
revert git checkout (9)
¿Cuáles son los finales de línea en los archivos? Apuesto a que son CRLF. Si lo son, 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 retirados deben ser nativos del sistema operativo, suponiendo que configure git correctamente.
Tengo un repositorio que tiene dos archivos que supuestamente cambié localmente.
Así que estoy atascado 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, aunque al mirarlo parece no ser cierto (parece que hay rangos de línea comunes que diff parece no ver).
Curiosamente, no recuerdo haber cambiado estos archivos localmente. Este repositorio se utiliza con un repositorio remoto (privado, en GitHub.com, FWIW).
No importa lo que haya intentado, no puedo descartar estos cambios locales. He intentado todo:
$ 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, intenté todo lo que se describe en ¿Cómo descarto los cambios no realizados en Git? y mucho más. Pero los 2 archivos permanecen bloqueados como "cambiados pero no confirmados".
¿Qué demonios causaría que dos archivos se bloquearan así y aparentemente "revertir-tabla"?
PD En la lista de arriba, que mostraba comandos que ya había probado, escribí erróneamente git revert
cuando quise decir git checkout
. Lo siento y gracias a aquellos de ustedes que respondieron que debería intentar checkout
. Edité la pregunta para corregirla. Definitivamente ya intenté checkout
.
Creo que sería útil proporcionar una pista sobre cómo reproducir el problema , para comprender mejor el problema:
$ git init
$ echo "*.txt -text" > .gitattributes
$ echo -e "hello/r/nworld" > 1.txt
$ git add 1.txt
$ git commit -m "committed as binary"
$ echo "*.txt text" > .gitattributes
$ echo "change.." >> 1.txt
# Ok let''s revert now
$ git checkout -- 1.txt
$ git status
modified: 1.txt
# Oooops, it didn''t revert!!
# hm let''s diff:
$ git diff
warning: CRLF will be replaced by LF in 1.txt.
The file will have its original line endings in your working
directory.
diff --git a/1.txt b/1.txt
index c78c505..94954ab 100644
--- a/1.txt
+++ b/1.txt
@@ -1,2 +1,2 @@
-hello
+hello
world
# No actual changes. Ahh, let''s change the line endings...
$ file 1.txt
1.txt: ASCII text, with CRLF line terminators
$ dos2unix 1.txt
dos2unix: converting file 1.txt to Unix format ...
$ git diff
git diff 1.txt
diff --git a/1.txt b/1.txt
index c78c505..94954ab 100644
--- a/1.txt
+++ b/1.txt
@@ -1,2 +1,2 @@
-hello
+hello
world
# No, it didn''t work, file is still considered modified.
# Let''s try to revert for once more:
$ git checkout -- 1.txt
$ git status
modified: 1.txt
# Nothing. Let''s use a magic command that prints wrongly committed files.
$ git grep -I --files-with-matches --perl-regexp ''/r'' HEAD
HEAD:1.txt
Segunda forma de reproducir: En el script anterior, reemplaza esta línea:
echo "*.txt -text" > .gitattributes
con
git config core.autocrlf=false
y mantener el resto de las líneas como está
¿Qué dice todo lo anterior? Un archivo de texto puede (en algunas circunstancias) comprometerse con CRLF, (por ejemplo, -text
en .gitattributes
/ o core.autocrlf=false
).
Cuando más adelante deseemos tratar el mismo archivo como texto ( -text
-> text
), tendrá que volverse a comprometer.
Por supuesto, puedes revertirlo temporalmente (como ha respondido correctamente ). En nuestro caso:
echo "*.txt -text" > .gitattributes
git checkout -- 1.txt
echo "*.txt text" > .gitattributes
La respuesta es : ¿realmente quieres hacer eso, porque va a 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 (se debe compilar git con --with-libpcre):
git grep -I --files-with-matches --perl-regexp ''/r'' HEAD
Al confirmar los archivos (suponiendo que desea tratarlos como texto), es lo mismo que hacer lo que se propone en este enlace http://help.github.com/line-endings/ para solucionar estos problemas. . Pero, en lugar de eliminar .git/index
y realizar el reset
, simplemente cambie el / los archivo / s, luego ejecute git checkout -- xyz zyf
y luego git checkout -- xyz zyf
.
Intenta revertir los cambios locales :
git checkout -- dir1/foo.aspx
git checkout -- dir2/foo.aspx
Otra posibilidad es que la diferencia (que le impide revertir estos archivos con un comando de finalización de compra) es una de modo de archivo. Esto es lo que me pasó a mí. En mi versión de git puedes descubrir esto usando
git diff dir1 / foo.aspx
Y le mostrará los cambios del modo de archivo. Sin embargo, todavía no te permitirá revertirlos. Para ese uso, ya sea
git config core.filemode false
o cambia tu git .config en tu editor de texto agregando
[núcleo]
filemode = false
Después de hacer esto, puede usar
git reset HEAD dir1 / foo.aspx
y el archivo debería desaparecer
(Recibí todo esto de la respuesta a ¿Cómo hago para que git ignore los cambios de modo (chmod)? )
Para mí, el problema no era sobre los finales de línea. Se trataba de cambiar el caso en el nombre de la carpeta (Reset_password -> Reset_Password). Esta solución me ayudó: https://.com/a/34919019/1328513
Pasé horas intentando resolver un problema similar: una rama remota que había revisado, que mostraba obstinadamente cuatro archivos como ''Modificados pero no actualizados'', incluso cuando borraba todos los archivos y ejecutaba git checkout -f
nuevamente (u otras variaciones de este enviar)!
Estos cuatro archivos eran necesarios, pero ciertamente no habían sido modificados por mí. Mi solución final: persuadir a Git de que no se han cambiado. Lo siguiente funciona para todos los archivos desprotegidos, mostrando el estado "modificado": ¡asegúrese de que ya ha confirmado / guardado alguno que realmente se ha modificado !:
git ls-files -m | xargs -i git update-index --assume-unchanged "{}"
En Mac OSX, sin embargo xargs funciona un poco diferente (gracias a Daniel por el comentario):
git ls-files -m | xargs -I {} git update-index --assume-unchanged {}
He agregado esto como un marcador de posición para mí la próxima vez, pero espero que también ayude a alguien más.
-Alabama
Tenía algunos archivos fantasma cambiados 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)
git config --local core.autocrlf false
Pero en otro caso encontré que se debía a un archivo .gitattributes
en la raíz que tenía algunas configuraciones de fin de línea, que intentaba aplicar autocrlf
para ciertos archivos incluso cuando estaba apagado. Eso no fue realmente útil, así que .gitattributes
, .gitattributes
y el archivo ya no se muestra como modificado.
así es como resolví el mismo problema en mi caso: abrir cambios en .gitattributes:
* text=auto
a:
#* text=auto
guardar y cerrar, luego revertir o restablecer, gracias a @Simon East por la pista
git checkout dir1/foo.aspx
git checkout dir2/foo.aspx