Hay tres lugares donde puede estar un archivo, por ejemplo, el árbol, el índice y la copia de trabajo. Cuando solo agrega un archivo a una carpeta, lo agrega a la copia de trabajo.
Cuando haces algo como git add file
lo agregas al índice. Y cuando lo comprometes, también lo agregas al árbol.
Probablemente te ayudará a conocer las tres banderas más comunes en git reset:
git reset [- <mode>
] [ <commit>
]
Este formulario restablece el encabezado de la rama actual <commit>
y posiblemente actualiza el índice (restableciéndolo al árbol de <commit>
) y el árbol de trabajo según <mode>
, que debe ser uno de los siguientes:
--soft
No toca el archivo de índice ni el árbol de trabajo en absoluto (pero reinicia la cabeza <commit>
, al igual que todos los modos). Esto deja todos los archivos modificados "Cambios a confirmar", como lo indicaría el estado de git.
--mezclado
Restablece el índice pero no el árbol de trabajo (es decir, los archivos modificados se conservan pero no se marcan para confirmar) e informa lo que no se ha actualizado. Esta es la acción por defecto.
--difícil
Restablece el índice y el árbol de trabajo. Cualquier cambio en los archivos rastreados en el árbol de trabajo desde entonces <commit>
se descarta.
Ahora, cuando hace algo como git reset HEAD
: lo que realmente está haciendo es git reset HEAD --mixed
y "restablecerá" el índice al estado que tenía antes de comenzar a agregar archivos / agregar modificaciones al índice (vía git add
) En este caso, la copia de trabajo y el El índice (o la puesta en escena) estaban sincronizados, pero hizo que HEAD y el índice estuvieran sincronizados después del restablecimiento.
git rm
por otro lado, elimina un archivo del directorio de trabajo y del índice, y cuando confirma, el archivo también se elimina del árbol. git rm --cached
sin embargo, elimina el archivo solo del índice y lo mantiene en su copia de trabajo. Esto es exactamente lo contrario de git add file
En este caso, hizo que el índice fuera diferente del HEAD y del trabajo, ya que HEAD tiene la versión previamente comprometida del archivo, la copia de trabajo tuvo la última modificación, si la hubo, o el contenido del HEAD de el archivo y eliminó el archivo del índice. Una confirmación ahora sincronizará el índice y el árbol y se eliminará el archivo.
git rm --cached
delgit diff
comando no muestra ningún diff, perogit diff --cached
muestra el diff, como si todavía estuviera en caché. Singit status
embargo, muestra el archivo como siendoUntracked
. Parece un poco inconsistente.