¿Cómo hacer para que GIT se olvide de un archivo?

Git Logo Wikipedia

Ocasionalmente en un proyecto disponemos de información sensible o archivos que no queremos subir al proyecto. Como por ejemplo logs, configuración de base de datos o archivos con claves de APIs entre otros. Desgraciadamente si no configuramos bien el .gitignore o si lo añadimos a posteriori git automaticamente realizara el seguimiento de este archivo.

¿Cómo hacer para que git se olvide de el permanentemente?

Es decir, para que el archivo no nos aparezca en el «git status» y lógicamente al hacer git commit no lo agregue al proyecto más… El comando básicamente es este:

git rm --cached <archivo>
git commit -am "Mensaje aleatorio"

Aunque este archivo deja de ser «cometido» por git seguirá presente dentro de nuestro proyecto local y repositorio. El problema, al menos por mi parte, cuando quieres actualizar el proyecto en otro lugar con «git pull» vas a obtener este mensaje:

error: Your local changes to the following files would be overwritten by merge:
	storage/file.log
Please, commit your changes or stash them before you can merge.

Para solucionar esto ultimo puedes como te dicen arriba, actualizando los cambios con un commit si tienes cambios por guardar, apilar los cambios «git stash» o haciendo esta ñapa y sobreescribiendo los ficheros:

git fetch --all
git reset --hard origin/master

Si estas trabajando en otra rama debes sustituir «master» con la tuya. Creo que no hay que decir que perderás los datos que no hayas guardado en el proyecto local. Básicamente «git fetch» descarga el repositorio sin mezclar nada y el comando «git reset» digamos que sobreescribe los archivos con lo que hay en el repositorio.

Eliminar la carpeta node_modules

Una de las «típicas» es olvidar «ignorar» la carpeta node_modules, dentro del proyecto. Lo que ocasiona que subes todo lo innecesario al repositorio, la solución es esta:

#añadir 'node_modules' a .gitignore

git rm -r --cached node_modules
git commit -m 'Remove the now ignored directory node_modules'
git push origin master

Moraleja del asunto…

Pues que este post lo escribo básicamente para mi, por no configurar correctamente el archivo .gitignore desde un principio. Si se utiliza un IDE como Netbeans que añade archivos automáticamente al proyecto es bastante fácil olvidarse. Ademas esto es un resumen en Español de estas dos discusiones en Stackoverflow: parte 1 y parte 2. Como podéis comprobar no soy el único «noob» en esto. Por último recomiendo a todos los que queráis aprender Git y Github de una forma amena os recomiendo este curso de Codeschool (Ingles), yo ya lo tengo acabado.