"Git rm –cached x" frente a "git reset head – x"?

GitRef.org – Básico :

git rm eliminará las inputs del área de preparación. Esto es un poco diferente de git reset HEAD que "descomprime" los files. Al decir "fuera del escenario" quiero decir que revierte el área de preparación a lo que estaba allí antes de que empezáramos a modificar las cosas. git rm por otro lado, simplemente patea el file fuera del escenario por completo, por lo que no está incluido en la próxima instantánea de confirmación, lo que efectivamente elimina.

De forma pnetworkingeterminada, un git rm file eliminará por completo el file del área de ensayo y también de su disco> (el directory de trabajo). Para dejar el file en el directory de trabajo, puede usar git rm --cached .

Pero, ¿cuál es exactamente la diferencia entre git rm --cached asd y git reset head -- asd ?

Hay tres lugares donde un file, por ejemplo, puede ser: el tree, el índice y la copy de trabajo. Cuando acaba de agregar un file a una carpeta, lo está agregando a la copy de trabajo.

Cuando hagas algo como git add file al índice. Y cuando lo cometes, lo agregas al tree también.

Probablemente te ayude a conocer los tres indicadores más comunes en el restablecimiento de git:

git reset [- <mode> ] [ <commit> ]

Esta forma restablece el encabezado actual a <commit> y posiblemente actualiza el índice (restableciéndolo al tree de <commit> ) y el tree de trabajo dependiendo de <mode> , que debe ser uno de los siguientes:
–suave

No toca el file de índice ni el tree de trabajo en absoluto (pero restablece el encabezado a <commit> , al igual que todos los modos). Esto deja todos los files modificados "Cambios que se comprometerán", como lo indicaría el estado de git.

–mezclado

Restablece el índice pero no el tree de trabajo (es decir, los files modificados se conservan pero no se marcan para la confirmación) e informa lo que no se ha actualizado. Esta es la acción por defecto.

–difícil

Restablece el índice y el tree de trabajo. Cualquier cambio en los files rastreados en el tree de trabajo desde <commit> se descarta.

Ahora, cuando hagas algo como git reset HEAD , lo que en realidad estás haciendo es git reset HEAD --mixed y "reiniciará" el índice al estado en que estaba antes de que comenzaras a agregar files / agregar modificaciones al índice (a través de git add ) En este caso, la copy de trabajo y el índice (o sorting) estaban sincronizados, pero usted hizo que HEAD y el índice estuvieran sincronizados después del reinicio.

git rm por otro lado, elimina un file del directory de trabajo y del índice, y cuando se confirma, el file también se elimina del tree. git rm --cached sin embargo, elimina el file del índice solo y lo mantiene en su copy de trabajo. Esto es exactamente lo opuesto al git add file En este caso, hizo que el índice sea diferente del HEAD y el que funciona, en el que HEAD tiene la versión previamente comprometida del file, la copy de trabajo tenía la última modificación, si corresponde, o el contenido desde HEAD del file y eliminó el file del índice. Una confirmación ahora sincronizará el índice y el tree y el file se eliminará.

Tal vez un ejemplo ayude:

 git rm --cached asd git commit -m "the file asd is gone from the repository" 

versus

 git reset HEAD -- asd git commit -m "the file asd remains in the repository" 

Tenga en count que si no ha cambiado nada más , la segunda confirmación no hará nada.

git rm --cached file eliminará el file del escenario. Es decir, cuando confirme el file se eliminará. git reset HEAD -- file simplemente restablecerá el file en el área de transición al estado donde estaba en la confirmación HEAD, es decir, deshará cualquier cambio que le haya hecho desde el último commit. Si ese cambio acaba de agregar el file, serán equivalentes.