ver revertir pendientes modificados ignorar descartar commits comandos cambios archivos archivo git gitignore

revertir - ¿Puedo ''git commit'' un archivo e ignorar sus cambios de contenido?



ignorar cambios git (4)

Cada desarrollador en mi equipo tiene su propia configuración local. Esa información de configuración se almacena en un archivo llamado devtargets.rb que se utiliza en nuestras tareas de compilación de rake. Sin embargo, no quiero que los desarrolladores se peguen entre sí a los archivos devtargets.

Mi primer pensamiento fue colocar ese archivo en la lista .gitignore para que no se .gitignore a git.

Entonces empecé a preguntarme: ¿es posible cometer el archivo, pero ignorar los cambios en el archivo? Por lo tanto, confirmaría una versión predeterminada del archivo y luego, cuando un desarrollador lo cambiara en su máquina local, git ignoraría los cambios y no aparecería en la lista de archivos modificados al hacer un estado de git o git commit .

¿Es eso posible? Sin duda sería una buena característica ...


Claro, hago exactamente esto de vez en cuando usando

git update-index --assume-unchanged [<file> ...]

Para deshacer y comenzar a rastrear nuevamente (si olvidó qué archivos no se rastrearon, vea esta pregunta ):

git update-index --no-assume-unchanged [<file> ...]

Documentación relevante :

- [no-] asumir-sin cambios
Cuando se especifica este indicador, los nombres de objeto registrados para las rutas no se actualizan. En su lugar, esta opción establece / desactiva el bit "asumir que no ha cambiado" para las rutas. Cuando el bit "asumir que no ha cambiado" está activado, el usuario se compromete a no cambiar el archivo y le permite a Git asumir que el archivo del árbol de trabajo coincide con lo que está registrado en el índice. Si desea cambiar el archivo del árbol de trabajo, debe desactivar el bit para indicarle a Git. A veces esto es útil cuando se trabaja con un proyecto grande en un sistema de archivos que tiene una llamada al sistema lstat(2) muy lenta (por ejemplo, cifs).

Git fallará (con gracia) en caso de que necesite modificar este archivo en el índice, por ejemplo, al fusionar en una confirmación; por lo tanto, en caso de que el archivo supuestamente sin seguimiento se modifique en sentido ascendente, deberá manejar la situación manualmente.

Si falla correctamente en este caso, significa que si realiza algún cambio en sentido ascendente a ese archivo (cambios legítimos, etc.) cuando realice una extracción, dirá:

$ git pull … From https://github.com/x/y 72a914a..106a261 master -> origin/master Updating 72a914a..106a261 error: Your local changes to the following files would be overwritten by merge: filename.ext

y se negará a fusionarse.

En ese punto, puede superar esto revertiendo sus cambios locales, aquí hay una forma:

$ git checkout filename.ext

luego, vuelva a tirar y vuelva a modificar su archivo local, o podría establecer –no-assume-unchanged y puede hacer un escondite normal y fusionar, etc. en ese punto.


La forma preferida de hacer esto es usar git update-index --skip-worktree <file> , como se explica en esta respuesta :

assume-unchanged está diseñado para casos en los que es costoso verificar si se ha modificado un grupo de archivos; cuando establece el bit, git (por supuesto) asume que los archivos correspondientes a esa parte del índice no se han modificado en la copia de trabajo. Así que evita un lío de estadísticas. Este bit se pierde cada vez que cambia la entrada del archivo en el índice (por lo tanto, cuando el archivo se cambia en sentido ascendente).

skip-worktree es más que eso: incluso cuando git sabe que el archivo ha sido modificado (o necesita ser modificado por un reinicio - hard o similar), fingirá que no lo ha sido, utilizando la versión del índice en su lugar . Esto persiste hasta que se descarta el índice.

Para deshacer esto, use git update-index --no-skip-worktree <file>


La práctica común parece ser crear un devtargets.default.rb y confirmarlo, y luego instruir a cada usuario para que copie ese archivo a devtargets.rb (que está en la lista .gitignore). Por ejemplo, CakePHP hace lo mismo para su archivo de configuración de base de datos que naturalmente cambia de una máquina a otra.


Para usuarios de IntelliJ IDEA: si desea ignorar los cambios de un archivo (o archivos), puede moverlo a un Change Set diferente.

  • Dirígete a Local Changes ( Cmd + 9 )
  • Seleccione los archivos que desea ignorar
  • F6 para moverlos a otro Change Set