2011-09-14 12 views
7

Supongamos que tengo un directorio que contiene cientos de archivos. Modifico varios de ellos, pero luego me doy cuenta de que mis cambios son malos. Si lo hago:¿Cómo puedo restaurar solo los archivos modificados en un checkout de git?

git checkout whole_folder 

Luego todo se vuelve a revisar, y tengo que recompilar todo. ¿Hay alguna manera de hacer que la verificación afecte solo a los archivos modificados, o debo ejecutar checkout en cada archivo por separado?

+0

Si lo hace 'git checkout - ' (la versión un poco más segura de 'git checkout whole_folder') las marcas de tiempo se mantienen lo mismo para los archivos que no son cambiados por ese comando. Eso significa que su proceso de compilación solo debería reconstruir los archivos que, como mínimo, piensa que necesita en función de los tiempos de reproducción. –

+0

¿Estás seguro de que Git verifica todo? IIRC git intenta realmente sacar solo los archivos que están modificados y no tocar nada más cuando haces el pago de git - whole_folder, o git reset --hard HEAD. – holygeek

+0

Entonces, debería hacer 'git checkout - whole_folder'? – Geo

Respuesta

13

Prueba esto:

$ git checkout `git ls-files -m` 

listas -m sólo los archivos modificados.

+0

¿No hay una solución multiplataforma disponible? A veces uso Windows desde un shell 'cmd.exe' estándar. – Geo

2

Lo que está haciendo es correcto, pero es posible que desee añadir un desambiguantes -- en caso de que tenga un nombre de directorio que es lo mismo que un nombre de rama, es decir:

git checkout -- whole_folder 

git sólo se actualizará las marcas de tiempo en los archivos que realmente necesita cambiar, por lo que si su herramienta de compilación basada en la dependencia está utilizando mtimes correctamente, debe reconstruirse la cantidad mínima segura de archivos. Si estás viendo un comportamiento diferente, eso sería un error.

2

Pero

git checkout -- $(git ls-files -m) 

también checksout los archivos borrados.

Si desea obtener sólo los archivos modificados este trabajo para mí:

git checkout -- $(git status -uno | grep --colour=never '#' | awk '{ print $2 $3 }' | grep --colour=never ^modified: | cut -c10-) 
+0

Gracias @TheFox. Casi funcionó. Tuve que modificar el comando un poco para que funcione para mí. Aquí está la línea que utilicé: '' 'git checkout - $ (estado de git | grep modificado: | corte -c14-)' '' – user1029978

Cuestiones relacionadas