🎩
Le he dado un par de vueltas a ciertas cosas que creo que son importantes de explicar antes de pasar a otras cosas. Soy consciente de que estoy explicando git muy a fuego lento y eso implica que, en vez de ver solamente acción de buenas a primeras, necesitamos tener cierta base clara.

Voy a explicar algo que parece demasiado obvio pero que luego veo que mucha gente no caemos en ello a nivel práctico.

Ficheros nuevos

Cuando hablamos de un fichero nuevo significa que no lo tenemos en el repositorio de git es decir, no lo tenemos en un commit.

Por ejemplo si ahora creamos un fichero por ejemplo primerFicheroNuevo.txt y hacemos un git diff no nos devolverá nada y pensarás, "es que no tiene nada que enseñar porque ese fichero está vacío". Bueno, realmente si que podría tenerlo en cuenta pero de momento no se lo estamos diciendo...

Creamos otro fichero segundoFicheroNuevo.txt y escribimos dentro la frase "cualquier cosa". Ahora si hacemos git diff.

¿Nos debería de mostrar lo que había antes y lo que hay ahora? Venga prueba... vaya pues da igual que el fichero este vacío como primerFicheroNuevo.txt como le añades contenido como segundoFicheroNuevo.txt no se muestra nada.

¿Qué está pasando?

Lo que pasa es que como el nuevo archivo no es rastreado por git cuando lo creas (está en el workspace recuerda), este no tiene manera de identificar lo que ha cambiado porque no está en el repositorio local.

$ git add segundoFicheroNuevo.txt 

Ahora ya tenemos en el staging area solamente ese fichero (si no comprueba con git status) pero todavía no podemos hacer git diff, tendremos que hacer un commit para que sepa que está en el repositorio:

git commit -m "Añadido segundo fichero"
Recuerda comprobar con git log que tenemos el commit creado.

Ficheros susceptibles de actualizar

Ahora sí nuestro segundoficheroNuevo.txt es un fichero que, si queremos seguir trabajando en él, git ya lo conoce y por lo tanto es un fichero susceptible de ser actualizado.

Vamos editar el fichero y a añadir el párrafo "otra cosa" debajo de lo que habíamos escrito. Ahora si podemos hacer git diff segundoFicheroNuevo.txt y nos devolverá lo siguiente:

new file mode 100644
index 0000000..e69de29
diff --git a/segundoFicheroNuevo.txt b/segundoFicheroNuevo.txt
index 4b39b64..a96acad 100644
--- a/segundoFicheroNuevo.txt
+++ b/segundoFicheroNuevo.txt
@@ -1 +1,2 @@
 Cualquier cosa
+otra cosa

En verde tenemos lo que está añadido.

Hagamos magia

¿Recuerdas que hemos dejado un primerFicheroNuevo.txt en el workspace y sin añadir, verdad? Comprueba si quieres con git status que está en rojo y sin trackear. Recuerda que no podíamos hacer git diff porque en teoría no tenemos ningún cambio y aunque añadamos cosas tampoco nos saldría nada. Pues vamos a cambiar eso!

$ git add -N primerFicheroNuevo.txt

Ahora haz un git diff... oh vaya, MAGIA

diff --git a/primerFicheroNuevo.txt b/primerFicheroNuevo.txt
new file mode 100644
index 0000000..e69de29

Y dime una cosa, ¿Ese fichero está en staging area?  Compruébalo con git status:

En la rama main
Cambios no rastreados para el commit:
  (usa "git add <archivo>..." para actualizar lo que será confirmado)
  (usa "git restore <archivo>..." para descartar los cambios en el directorio de trabajo)
	nuevo archivo:  primerFicheroNuevo.txt

¡Vaya! ¡En rojo! Es como si siguiera en el workspace pero podemos tratarlo como si fuera... un fichero a actualizar, o más bien un fichero que estuviera en el repositorio local.

Ahora algo también interesante, borra ese fichero con rm segundoficheroNuevo.txt y vuelve a crearlo con el mismo nombre, ¿Se creará un fichero nuevo o lo trata como un fichero a actualizar? Pues entiende que es el mismo fichero a actualizar porque git no tiene trackeado el borrado (como consecuencia puedes hacer el git diff otra vez xD).

Si te lías un pelin con estas pruebas, más vale volver a crear un repositorio de git y empezar de cero. Borrón y cuenta nueva!

Conclusión

Con el comando git add -N <nombre del fichero> podemos hacer que git entienda los ficheros nuevos como ficheros que ya existen pero sin pasar al staging area.

Git a veces es poco intuitivo, os he enseñado git add como un proceso de pase del workspace al staging area para tener trackeados los ficheros pero en este caso se queda en el workspace por la justificación que os he explicado antes.

Este aprendizaje es necesario para lo que vendrá más adelante pero ya es cosa de otro día.