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 filelo 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 --mixedy "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 rmpor 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 --cachedsin 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 --cacheddelgit diffcomando no muestra ningún diff, perogit diff --cachedmuestra el diff, como si todavía estuviera en caché. Singit statusembargo, muestra el archivo como siendoUntracked. Parece un poco inconsistente.git reset --mixed. Estaba un poco confundido por la afirmación quegit rm --cachedes lo contrario degit add. Tomado literalmente, es incorrecto y podría causar daños. En mi caso, solíagit addagregar un archivo modificado al área de preparación y quería lo opuesto a "ese agregado", no el agregado inicial del archivo. La respuesta de Greg Hewgill me ayudó a obtener una imagen más clara.git rm --cached'es exactamente lo contrario degit add file' es engañoso.git reset fileestá más cerca de ser lo contrario degit add file.Quizás un ejemplo ayude:
versus
Tenga en cuenta que si no ha cambiado nada más , la segunda confirmación en realidad no hará nada.
fuente
--se utiliza para separar las opciones de comando de los nombres de archivo. Si hubiera una rama y un archivo con nombreasd, entoncesgit reset HEAD asdsería ambiguo. El--dice "todo lo que sigue a esto es un nombre de archivo".git reset HEAD <file>exactamente lo mismo quegit rm --cached <file>y luegogit add --intent-to-add <file>?git rm --cached filese quite el archivo desde el escenario. Es decir, cuando confirme el archivo será eliminado.git reset HEAD -- filesimplemente restablecerá el archivo en el área de preparación al estado donde estaba en la confirmación HEAD, es decir, deshacerá cualquier cambio que haya realizado desde la última confirmación. Si ese cambio sucede al agregar nuevamente el archivo, entonces serán equivalentes.fuente
git rm --cached filees más o menos lo contrariogit add, esta respuesta tenía mucho sentido para mí, y fue bastante sucinta. Casi tan corto como este comentario;)git rm --cached fileno es lo contrario degit add file. El comportamiento es el opuestogit add fileal caso específico en el que ha agregado un archivo nuevo, previamente no rastreado. En cualquier otro caso, lo contrario degit add fileesgit reset HEAD file.git reset HEAD filetambién se inviertegit add fileen el primer caso (agregar un archivo no rastreado), y en todos los casos, por eso es lo que git sugiere hacer si desea revertir un complemento de git.