Además de la respuesta aceptada, si su archivo agregado por error era enorme, probablemente notará que, incluso después de eliminarlo del índice con ' git reset
', todavía parece ocupar espacio en el.git
directorio.
Esto no es nada de qué preocuparse; el archivo todavía está en el repositorio, pero solo como un "objeto suelto". No se copiará a otros repositorios (a través de clonar, empujar), y el espacio se recuperará eventualmente, aunque tal vez no muy pronto. Si está ansioso, puede correr:
git gc --prune=now
Actualizar (lo que sigue es mi intento de aclarar alguna confusión que pueda surgir de las respuestas más votadas):
Entonces, ¿cuál es el verdadero deshacer degit add
?
git reset HEAD <file>
?
o
git rm --cached <file>
?
Estrictamente hablando, y si no me equivoco: ninguno .
git add
no se puede deshacer forma segura, en general.
Recordemos primero lo que git add <file>
realmente hace:
Si <file>
se no rastreado previamente , git add
lo agrega a la caché , con su contenido actual.
Si <file>
fue ya rastreado , git add
guarda el contenido actual (instantánea, versión) a la caché. En Git, esta acción todavía se llama agregar , (no solo actualizarla ), porque dos versiones diferentes (instantáneas) de un archivo se consideran dos elementos diferentes: por lo tanto, de hecho, estamos agregando un nuevo elemento a la memoria caché, para ser eventualmente comprometido después.
A la luz de esto, la pregunta es ligeramente ambigua:
Agregué por error archivos usando el comando ...
El escenario del OP parece ser el primero (archivo no rastreado), queremos que el "deshacer" elimine el archivo (no solo el contenido actual) de los elementos rastreados. Si este es el caso, entonces está bien ejecutar git rm --cached <file>
.
Y también podríamos correr git reset HEAD <file>
. En general, esto es preferible, porque funciona en ambos escenarios: también deshace cuando agregamos erróneamente una versión de un elemento ya rastreado.
Pero hay dos advertencias.
Primero: hay (como se señala en la respuesta) solo un escenario en el que git reset HEAD
no funciona, perogit rm --cached
funciona: un nuevo repositorio (sin confirmaciones). Pero, realmente, este es un caso prácticamente irrelevante.
Segundo: tenga en cuenta que git reset HEAD
no puede recuperar mágicamente el contenido del archivo previamente almacenado en caché, solo lo vuelve a sincronizar desde HEAD. Si nuestra equivocadagit add
guía sobrescribió una versión previa no confirmada, no podemos recuperarla. Por eso, estrictamente hablando, no podemos deshacer [*].
Ejemplo:
$ git init
$ echo "version 1" > file.txt
$ git add file.txt # First add of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add file.txt # Stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt
$ git diff file.txt
-version 2
+version 3
$ git add file.txt # Oops we didn't mean this
$ git reset HEAD file.txt # Undo?
$ git diff --cached file.txt # No dif, of course. stage == HEAD
$ git diff file.txt # We have irrevocably lost "version 2"
-version 1
+version 3
Por supuesto, esto no es muy crítico si solo seguimos el flujo de trabajo perezoso habitual de hacer 'git add' solo para agregar nuevos archivos (caso 1), y actualizamos nuevos contenidos a través del git commit -a
comando commit .
* (Editar: lo anterior es prácticamente correcto, pero aún puede haber algunas formas un poco hackeadas / complicadas para recuperar los cambios que se organizaron, pero no se cometieron y luego se sobrescribieron; vea los comentarios de Johannes Matokic e iolsmit)
HEAD
ohead
ahora pueden usar@
en su lugarHEAD
. Vea esta respuesta (última sección) para saber por qué puede hacer eso.