Agregué por error archivos a Git usando el comando:
git add myfile.txt
Aún no he corrido git commit
. ¿Hay alguna manera de deshacer esto, por lo que estos archivos no se incluirán en la confirmación?
git
version-control
git-commit
git-stage
paxos1977
fuente
fuente
HEAD
ohead
ahora pueden usar@
en su lugarHEAD
. Vea esta respuesta (última sección) para saber por qué puede hacer eso.git checkout
no elimina los cambios por etapas del índice de confirmación. Solo revierte los cambios no organizados en la última revisión comprometida, que por cierto tampoco es lo que quiero, quiero esos cambios, solo los quiero en una confirmación posterior.Respuestas:
Puede deshacer
git add
antes de comprometerse conque lo eliminará del índice actual (la lista "a punto de confirmarse") sin cambiar nada más.
Puedes usar
sin ningún nombre de archivo para desestabilizar todos los cambios debidos. Esto puede ser útil cuando hay demasiados archivos para enumerar uno por uno en un período de tiempo razonable.
En versiones anteriores de Git, los comandos anteriores son equivalentes
git reset HEAD <file>
ygit reset HEAD
respectivamente, y fallarán si noHEAD
está definido (porque aún no ha realizado ninguna confirmación en su repositorio) o ambiguo (porque creó una rama llamadaHEAD
, lo cual es una estupidez que no deberías hacer). Sin embargo, esto se cambió en Git 1.8.2 , por lo que en las versiones modernas de Git puede usar los comandos anteriores incluso antes de realizar su primera confirmación:fuente
git add
sobrescribió una versión previa no confirmada, no podemos recuperarla. Traté de aclarar esto en mi respuesta a continuación.git reset HEAD *.ext
¿Dóndeext
están los archivos de la extensión dada que desea agregar? Para mí fue*.bmp
&*.zip
git rm --cached
), significa que se está preparando para realizar una confirmación que elimine ese archivo.git reset HEAD <filename>
por otro lado, copiará el archivo de HEAD al índice, para que la próxima confirmación no muestre ningún cambio realizado en ese archivo.git reset -p
igualgit add -p
. ¡Esto es asombroso!git add
que desea recuperar (61/3AF3...
- > ID del objeto613AF3...
), entoncesgit cat-file -p <object-id>
(podría valer la pena recuperar varias horas de trabajo pero también una lección para comprometerse más a menudo ...)Usted quiere:
Razonamiento:
Cuando era nuevo en esto, lo intenté por primera vez
(para deshacer toda mi adición inicial), solo para obtener este (no tan) mensaje útil:
Resulta que esto se debe a que la referencia HEAD (¿rama?) No existe hasta después de la primera confirmación. Es decir, te encontrarás con el mismo problema de principiante que yo si tu flujo de trabajo, como el mío, fuera algo así como:
git init
git add .
git status
... muchos rollos de basura por ...
=> Maldición, no quería agregar todo eso.
google "deshacer git add"
=> buscar desbordamiento de pila - yay
git reset .
=> fatal: no se pudo resolver 'HEAD' como una referencia válida.
Resulta que hay un error registrado en contra de la inutilidad de esto en la lista de correo.
Y que la solución correcta estaba allí en la salida de estado de Git (que, sí, lo pasé por alto como 'basura')
Y la solución de hecho es usar
git rm --cached FILE
.Tenga en cuenta las advertencias en otro lugar aquí:
git rm
elimina su copia de trabajo local del archivo, pero no si usa --cached . Aquí está el resultado degit help rm
:Procedo a usar
para eliminar todo y comenzar de nuevo. Sin embargo, no funcionó, porque si bien
add .
es recursivo, resulta querm
debe-r
repetirse. Suspiro.Bien, ahora estoy de vuelta a donde empecé. La próxima vez voy a usar
-n
para hacer una carrera en seco y ver qué se agregará:Comprimí todo en un lugar seguro antes de confiar
git help rm
en que--cached
no destruiría nada (y qué pasa si lo escribí mal).fuente
rm -rf .git
,git init
porque no confiabagit rm --cached
en mantener mi copia de trabajo. Dice un poco sobre cómo git sigue siendo demasiado complejo en algunos lugares.git unstage
debería ser un comando estándar estándar, no me importa si puedo agregarlo como un alias.git reset HEAD <File>...
git add
comando agregó nuevos archivos, pero no cambia los archivos existentes.Si escribe:
Git le dirá lo que está organizado, etc., incluidas las instrucciones sobre cómo quitar el escenario:
Me parece que Git hace un buen trabajo al empujarme a hacer lo correcto en situaciones como esta.
Nota: Las versiones recientes de Git (1.8.4.x) han cambiado este mensaje:
fuente
add
archivo ed ya estaba siendo rastreado (add
solo se guardó una nueva versión en el caché; aquí mostrará su mensaje). En otros lugares, si el archivo no seuse "git rm --cached <file>..." to unstage
git reset HEAD <file>
uno es el único que funcionará en caso de que desee eliminar la eliminación de un archivogit reset HEAD
que desestabilicePara aclarar:
git add
mueve los cambios del directorio de trabajo actual al área de preparación (índice).Este proceso se llama puesta en escena . Entonces, el comando más natural para organizar los cambios (archivos modificados) es el obvio:
git add
es solo un alias más fácil de escribir paragit stage
Lástima que no hay
git unstage
nigit unadd
comandos. El relevante es más difícil de adivinar o recordar, pero es bastante obvio:Podemos crear fácilmente un alias para esto:
Y finalmente, tenemos nuevos comandos:
Personalmente uso alias aún más cortos:
fuente
git stage
es el alias degit add
, que es el comando histórico, tanto en Git como en otros SCM. Se ha agregado en diciembre de 2008 con commit 11920d28da en el "repositorio de git de Git", si puedo decirlo.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:
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 de
git 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:
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:
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)
fuente
git cat-file
podría usarse para recuperar su contenido.git add
es a través degit fsck --unreachable
una lista de todos los obj inalcanzables, que luego puede inspeccionargit show SHA-1_ID
ogit fsck --lost-found
> Escribir objetos colgantes en.git/lost-found/commit/
o.git/lost-found/other/
, según el tipo. Ver tambiéngit fsck --help
Deshacer un archivo que ya se ha agregado es bastante fácil con Git. Para restablecer
myfile.txt
, que ya se han agregado, use:Explicación:
Después de organizar los archivos no deseados, puede deshacerlos
git reset
.Head
es la cabecera de su archivo en el local y el último parámetro es el nombre de su archivo.He creado los pasos en la imagen a continuación con más detalles para usted, incluidos todos los pasos que pueden ocurrir en estos casos:
fuente
"des-agregará" todo lo que haya agregado de su directorio actual de forma recursiva
fuente
git reset HEAD <file>
diríafatal: Failed to resolve 'HEAD' as a valid ref.
correr
y elimine todos los archivos manualmente o seleccionándolos y haciendo clic en el botón Unstage from commit .
fuente
git-gui
..." :)Git tiene comandos para cada acción imaginable, pero necesita un amplio conocimiento para hacer las cosas bien y por eso es contraintuitivo en el mejor de los casos ...
Lo que hiciste antes:
git add .
, ogit add <file>
.Lo que quieras:
Elimine el archivo del índice, pero manténgalo versionado y deje cambios sin confirmar en la copia de trabajo:
Restablezca el archivo al último estado desde HEAD, deshaciendo los cambios y eliminándolos del índice:
Esto es necesario ya
git reset --hard HEAD
que no funcionará con archivos individuales.Eliminar
<file>
del índice y el control de versiones, manteniendo el archivo sin versión con cambios en la copia de trabajo:Eliminar
<file>
de la copia de trabajo y versionar completamente:fuente
reset head
deshace sus cambios actuales, pero git todavía está monitoreando el archivo.rm --cached
elimina el archivo del control de versiones, por lo que git ya no lo comprueba en busca de cambios (y también elimina los cambios actuales eventualmente indexados, indicados a git por el anterioradd
), pero el archivo modificado se guardará en su copia de trabajo, es decir, en su carpeta de archivos en el disco duro.git reset HEAD <file>
temporal: el comando se aplicará solo a la próxima confirmación, perogit rm --cached <file>
se desestabilizará hasta que se agregue nuevamentegit add <file>
. Además,git rm --cached <file>
significa que si empuja esa rama al control remoto, cualquiera que tire de la rama obtendrá el archivo REALMENTE eliminado de su carpeta.La pregunta no está claramente planteada. La razón es que
git add
tiene dos significados:git rm --cached file
.git reset HEAD file
.En caso de duda, use
Porque hace lo esperado en ambos casos.
Advertencia: si lo hace
git rm --cached file
en un archivo que fue modificado (un archivo que existía antes en el repositorio), ¡entonces el archivo se eliminarágit commit
! Todavía existirá en su sistema de archivos, pero si alguien más retira su confirmación, el archivo se eliminará de su árbol de trabajo.git status
le dirá si el archivo era nuevo o modificado :fuente
git rm --cached somefile
. Espero que esta respuesta suba por la página a una posición destacada donde pueda proteger a los novatos de ser engañados por todas las afirmaciones falsas.Si está en su confirmación inicial y no puede usar
git reset
, simplemente declare "bancarrota Git" y elimine la.git
carpeta y comience de nuevofuente
git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'
(Esto también funciona cuando no hay confirmaciones anteriores,Failed to resolve 'HEAD'
problema re )Según muchas de las otras respuestas, puede usar
git reset
PERO:
Encontré esta gran publicación que realmente agrega el comando Git (bueno, un alias) para
git unadd
: ver git unadd para más detalles o ...Simplemente,
Ahora usted puede
fuente
Úselo
git add -i
para eliminar archivos recién agregados de su próxima confirmación. Ejemplo:Agregar el archivo que no quería:
Entrando en el complemento interactivo para deshacer su complemento (los comandos escritos aquí en git son "r" (revertir), "1" (la primera entrada en la lista muestra revertir), 'return' para salir del modo revertir y "q" (dejar):
¡Eso es! Aquí está su prueba, que muestra que "foo" está de vuelta en la lista sin seguimiento:
fuente
git remove
ogit rm
puede usarse para esto, con la--cached
bandera. Tratar:fuente
git rm --cached ...
eliminará archivos de un repositorio de git. Todavía existirán en su computadora, pero esto es MUY diferente de los cambios no escalonados en un archivo. Para cualquiera que se encuentre con esto, no es una respuesta válida a la pregunta.Aquí hay una manera de evitar este molesto problema cuando comienza un nuevo proyecto:
git init
.Git hace que sea realmente difícil hacerlo
git reset
si no tienes ninguna confirmación. Si crea una pequeña confirmación inicial solo por el hecho de tener una, después de eso puede hacerlogit add -A
ygit reset
tantas veces como desee para hacer todo bien.Otra ventaja de este método es que si luego se encuentra con problemas de final de línea y necesita actualizar todos sus archivos, es fácil:
fuente
autocrlf
valor ... Esto no funcionará en todos los proyectos, dependiendo de la configuración.git reset somefile
ygit reset
ambos trabajan antes de hacer el primer commit, ahora. Este ha sido el caso desde varios lanzamientos de Git.Tal vez Git ha evolucionado desde que publicaste tu pregunta.
Ahora puedes probar:
Esto debería ser lo que estás buscando.
fuente
Tenga en cuenta que si no puede especificar una revisión, debe incluir un separador. Ejemplo de mi consola:
(Git versión 1.7.5.4)
fuente
git reset <path>
y funciona bien sin un separador. También estoy usando git 1.9.0. ¿Quizás no funciona en versiones anteriores?Para eliminar archivos nuevos del área de preparación (y solo en el caso de un archivo nuevo), como se sugirió anteriormente:
Use rm --cached solo para nuevos archivos agregados accidentalmente.
fuente
--cached
es una parte realmente importante.Para restablecer cada archivo en una carpeta particular (y sus subcarpetas), puede usar el siguiente comando:
fuente
git status
para ver cualquier cosa restante y restablecerlo manualmente, es decirgit reset file
.Use el
*
comando para manejar múltiples archivos a la vez:etc.
fuente
.*
o.*.prj
Simplemente
git reset
escríbalo volverá atrás y es como si nunca hubiera escritogit add .
desde su última confirmación. Asegúrese de haberse comprometido antes.fuente
Supongamos que creo un nuevo archivo
newFile.txt
:Supongamos que agrego el archivo accidentalmente
git add newFile.txt
:Ahora quiero deshacer este complemento, antes de confirmar
git reset newFile.txt
:fuente
Para un archivo específico:
Para todos los archivos agregados:
Nota: el pago cambia el código en los archivos y pasa al último estado actualizado (comprometido). restablecer no cambia los códigos; solo restablece el encabezado.
fuente
git reset <file>
ygit checkout <file>
.Este comando eliminará sus cambios:
También puedes usar
para agregar partes de archivos.
fuente
También hay modo interactivo:
Elija la opción 3 para eliminar archivos. En mi caso, a menudo quiero agregar más de un archivo, y con el modo interactivo puede usar números como este para agregar archivos. Esto tomará todo menos 4: 1, 2, 3 y 5
Para elegir una secuencia, simplemente escriba 1-5 para tomar todo del 1 al 5.
Archivos de preparación Git
fuente
Para deshacer
git add
, use:fuente
Eliminará un archivo llamado filename.txt del índice actual, el área "a punto de confirmarse", sin cambiar nada más.
fuente
git add myfile.txt
# Esto agregará su archivo a la lista de compromisosMuy opuesto a este comando es,
entonces, estarás en el estado anterior. Se especificará nuevamente en la lista sin seguimiento (estado anterior).
Se restablecerá la cabeza con ese archivo especificado. entonces, si su cabeza no tiene los medios, simplemente lo restablecerá.
fuente
En Sourcetree puede hacerlo fácilmente a través de la GUI. Puede verificar qué comando usa Sourcetree para quitar el escenario de un archivo.
Creé un nuevo archivo y lo agregué a Git. Luego lo desestimé usando la GUI de Sourcetree. Este es el resultado:
Sourcetree utiliza
reset
para desestabilizar nuevos archivos.fuente
fuente