Pregunta ¿Cómo se puede deshacer el último git add?


¿Es posible desestabilizar el último cambio por etapas (no comprometido) en git? Supongamos que hay muchos archivos en la rama actual, algunos en etapas, otros no. En algún momento, algún tonto programador ejecutó accidentalmente:

git add -- .

...en lugar de:

git checkout -- .

¿Puede este programador ahora desestabilizar sus últimos cambios con algo mágico git ¿mando? ¿O debería haberse comprometido antes de experimentar en primer lugar?


169
2017-08-26 17:21


origen


Respuestas:


Puedes usar git reset. Esto 'desestabilizará' todos los archivos que haya agregado después de su última confirmación.

Si quiere borrar solo algunos archivos, use git reset -- <file 1> <file 2> <file n>.

También es posible eliminar algunos de los cambios en los archivos mediante el uso de git reset -p.


280
2017-08-26 17:59



No puedes deshacer el último git add, pero puedes deshacer todo adds desde el último commit. git reset sin un argumento de compromiso restablece el índice (cambios en etapas no realizados):

git reset

37
2017-08-26 17:39



Entonces la verdadera respuesta a

¿Puede este programador ahora desestabilizar sus últimos cambios con algún comando mágico de git?

es en realidad: No, no puedes dejar de grabar solo el último git add.

Eso es si interpretamos la pregunta como en la siguiente situación:

Archivo inicial:

void foo() {

}

main() {
    foo();
}

Primer cambio seguido por git add:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

Segundo cambio seguido por git add:

void foo(int bar, String baz) {
    print("$bar $baz");
}

main() {
    foo(1337, "h4x0r");
}

En este caso, git reset -p no ayudará, ya que su granularidad más pequeña son las líneas. git no sabe eso sobre el estado intermedio de:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

nunca más.


15
2017-10-17 12:35



Podrías usar git reset (ver documentos)


5
2017-08-26 17:39



En la fecha, git solicita:

  1. use "git rm --cached <file>..." to unstage si los archivos no estaban en el repositorio. Desplaza los archivos manteniéndolos allí.
  2. use "git reset HEAD <file>..." to unstage si los archivos estaban en el repositorio, y los está agregando como modificados. Mantiene los archivos tal como están y los desestabiliza.

Por lo que sé, no puedes deshacer el git add -- pero puede borrar una lista de archivos como se mencionó anteriormente.


2
2018-04-06 20:25



  • Elimine el archivo del índice, pero manténgalo actualizado y déjelo sin cambios confirmados en la copia de trabajo:

    git reset head <file>
    
  • Restablezca el archivo al último estado desde HEAD, deshaciendo los cambios y eliminándolos del índice:

    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>
    

    Esto es necesario ya git reset --hard HEAD no funcionará con archivos individuales.

  • retirar <file> desde índice y control de versiones, manteniendo el archivo sin versión con cambios en la copia de trabajo:

    git rm --cached <file>
    
  • retirar <file> de copia de trabajo y control de versiones por completo:

    git rm <file>
    

2
2018-02-04 05:29



Si quieres eliminar todos los archivos agregados de git para cometer

git reset

Si quieres eliminar un archivo individual

git rm <file>

1
2017-10-25 11:03



Dependiendo del tamaño y la escala de la dificultad, puede crear una rama de cero (temporal) y comprometer el trabajo actual allí.

Luego, cambie a la rama original y finalice la compra, y elija los archivos apropiados desde la confirmación de reutilización.

Al menos, tendría un registro permanente de los estados actuales y anteriores desde los que trabajar (hasta que elimine esa rama de cero).


0
2017-08-27 13:06