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.git reset --mixed
. Estaba un poco confundido por la afirmación quegit rm --cached
es lo contrario degit add
. Tomado literalmente, es incorrecto y podría causar daños. En mi caso, solíagit add
agregar 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 file
está 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 asd
serí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 file
se quite el archivo desde el escenario. Es decir, cuando confirme el archivo será eliminado.git reset HEAD -- file
simplemente 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 file
es 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 file
no es lo contrario degit add file
. El comportamiento es el opuestogit add file
al caso específico en el que ha agregado un archivo nuevo, previamente no rastreado. En cualquier otro caso, lo contrario degit add file
esgit reset HEAD file
.git reset HEAD file
también se inviertegit add file
en 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.