Come puoi annullare l'ultima aggiunta di git?


193

È possibile mettere in scena l'ultima modifica in scena (non impegnata) in git ? Supponiamo che ci fossero molti file nel ramo corrente, alcuni messi in scena, altri no. Ad un certo punto, qualche programmatore insensato ha accidentalmente eseguito:

git add -- .

...invece di:

git checkout -- .

Questo programmatore può ora mettere in scena le sue ultime modifiche con un comando git magico ? O avrebbe dovuto impegnarsi prima di sperimentare in primo luogo?


Eh. Abbiamo però una domanda utile e una risposta.
Steveha,

2

Credo che non sia il duplicato. OP nell'altra domanda sta chiedendo un modo per annullare questo o rimuovere questi file dal commit. Voglio (edito) precisamente e solo per annullare le modifiche che sono state aggiunte con l'ultimo git addcomando, specialmente per i file che avevano già messo in scena modifiche e che avevano alcune modifiche che dovevano essere annullate, non messe in scena. Non posso dire che l'altra domanda non è correlata però.
Septagram,

1
Forse avrebbe dovuto / essere / commesso prima di sperimentare in primo luogo.
android.weasel,

@ android.weasel sì, è stato molti anni fa ...
Septagram,

Risposte:


299

È possibile utilizzare git reset. Questo "toglierà la scena" a tutti i file aggiunti dopo l'ultimo commit.

Se si desidera disinstallare solo alcuni file, utilizzare git reset -- <file 1> <file 2> <file n>.

Inoltre è possibile annullare la messa in scena di alcune delle modifiche ai file utilizzando git reset -p.


3
Che triste. Dopo tutto, immagino che ci sia qualcosa di sbagliato nelle mie pratiche di impegno. Accettare questa risposta, perché hai menzionato -pswitch. Grazie! :)
Septagram,

Genera (per me) l'errore: fatale: impossibile risolvere "HEAD" come riferimento valido. Non ho ancora commesso nulla (nuovo repository) appena fatto git add. e me ne sono pentito. Non voglio ripristinare l'intero componente aggiuntivo, solo una directory. git reset - dir /*.* genera l'errore sopra.
Francis Davey,

... Ah, vedo cosa sta succedendo per me. Non avevo ancora nulla a cui HEAD potesse puntare e quindi il reset di git non è riuscito (perché funziona su HEAD).
Francis Davey,

42

Non è possibile annullare l' ultima aggiunta di git, ma è possibile annullare tutti addi messaggi dall'ultimo commit. git resetsenza un argomento di commit reimposta l'indice (disattiva le modifiche temporanee):

git reset

2
"Non è possibile annullare l' ultima aggiunta di git": Wow, questo è sorprendente e potenzialmente doloroso. C'è una fonte definitiva per questo? Inoltre, c'è una buona ragione per cui dovrebbe essere così? Grazie!
Andrew Moylan,

@AndrewMoylan: beh, non esiste un modo automatico per farlo. Puoi sempre resetun singolo file o utilizzare reset -pper annullare la messa in scena di un hunk specifico.
Knittl,

15

Quindi la vera risposta a

Questo programmatore può ora mettere in scena le sue ultime modifiche con un comando git magico?

è in realtà: No, non è possibile rimuovere dal palco solo l'ultimo git add.

Cioè se interpretiamo la domanda come nella seguente situazione:

File iniziale:

void foo() {

}

main() {
    foo();
}

Primo cambiamento seguito da git add:

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

main() {
    foo(1337);
}

Seconda modifica seguita da git add:

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

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

In questo caso, git reset -pnon aiuterà, poiché la sua più piccola granularità sono le linee. gitnon lo sa dello stato intermedio di:

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

main() {
    foo(1337);
}

più.


Mi sono preoccupato perché come nuovo utente git, questa è una distinzione davvero importante che evidenzia ciò che i miei amici descrivono come "avere una buona igiene del check-in" ... la mia esperienza personale - è stata descritta come "carsharing" (male!).
benc


3

Alla data git richiede:

  1. use "git rm --cached <file>..." to unstagese i file non erano nel repository. Mette in scena i file mantenendoli lì.
  2. use "git reset HEAD <file>..." to unstagese i file erano nel repository e li stai aggiungendo come modificati. Mantiene i file così come sono e li mette in scena.

A mia conoscenza, non è possibile annullare il git add --ma è possibile annullare la creazione di un elenco di file come indicato sopra.


2
  • Rimuovi il file dall'indice, ma mantienilo aggiornato e lasciato con modifiche senza commit nella copia di lavoro:

    git reset head <file>
    
  • Ripristina il file all'ultimo stato da HEAD, annullando le modifiche e rimuovendole dall'indice:

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

    Ciò è necessario poiché git reset --hard HEADnon funziona con file singoli.

  • Rimuovi <file>dall'indice e dal controllo delle versioni, mantenendo il file non aggiornato con modifiche nella copia di lavoro:

    git rm --cached <file>
    
  • Rimuovi <file>dalla copia di lavoro e dal controllo delle versioni completamente:

    git rm <file>
    

2

Se vuoi rimuovere tutti i file aggiunti da git per commit

git reset

Se si desidera rimuovere un singolo file

git rm <file>

1

Puoi usare

git reset

per annullare i file locali aggiunti di recente

 git reset file_name

per annullare le modifiche per un file specifico


0

A seconda delle dimensioni e della scala del difficile, è possibile creare un ramo scratch (temporaneo) e impegnare il lavoro corrente lì.

Quindi passa a e verifica il tuo ramo originale e scegli i file appropriati dal commit di scratch.

Almeno avresti una registrazione permanente degli stati attuali e precedenti su cui lavorare (fino a quando non elimini quel ramo di scratch).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.