Risposte:
Aggiornamento (un paio d'anni dopo)
È banale rimuoverlo solo dall'indice.
Vero: puoi reimpostare un file sul contenuto dell'indice abbastanza facilmente, come suggerisce la risposta più recente (scritta da Matt Connolly ):
git reset HEAD^ path/to/file/to/revert
HEAD^
consente al file di accedere al suo contenuto nel commit precedente prima dell'ultimo.
Quindi puoi git commit --amend
, come ho scritto in origine di seguito.
Con Git 2.23 (agosto 2019), potresti usare il nuovo git restore
comando
git restore --source=HEAD^ --staged -- path/to/file/to/revert
più breve:
git restore -s@^ -S -- path/to/file/to/revert
Ancora una volta, è possibile git commit --amend
, come ho scritto in origine di seguito.
Risposta originale (gennaio 2011)
Se questo è il tuo ultimo commit (e non lo hai spinto da nessuna parte), puoi modificarlo :
(prima scorta o salvataggio b
)
git commit --amend
Quindi eliminare b, ripetere il commit. Ripristina b e il gioco è fatto.
--amend
Utilizzato per modificare la punta del ramo corrente.
Preparare l'oggetto albero che si desidera sostituire l'ultimo commit come al solito (questo include i soliti percorsi -i / -o ed espliciti) e l'editor del registro di commit viene eseguito il seeding con il messaggio di commit dalla punta del ramo corrente.
Il commit che crei sostituisce il suggerimento corrente - se si trattava di una fusione, i genitori del suggerimento corrente saranno i genitori - quindi l'attuale commit superiore viene scartato.
git diff --name-only HEAD^
- (facoltativo) consente di elencare i file modificati nell'ultimo commit.git reset HEAD^ path/to/file/to/revert
- per ripristinare l' indice sull'ultima versione, lasciando intatta la copia di lavoro.git commit --amend
- modificare l'ultimo commit per includere le modifiche dell'indicegit commit -a --amend
(cioè non aggiungere file) per il passaggio 3, altrimenti commetterai le modifiche alla copia di lavoro che sono le modifiche che stai cercando di rimuovere. Un passaggio 2.5 facoltativo potrebbe essere git checkout path/to/file/to/revert
quello di ripulire anche la tua copia di lavoro.
git rm --cached path/to/file/to/revert
per annullare l'aggiunta del file senza eliminarlo dall'albero.
In alternativa, se si sta utilizzando git gui
, è sufficiente selezionare l'opzione "Modifica ultimo commit", il file aggiunto viene visualizzato nell'elenco "Staged", fare clic sull'icona corrispondente per spostarlo nell'elenco "Unstaged" e eseguire il commit.
Se si desidera eliminare b dall'ultimo commit
git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend
Se si desidera rimuovere tutte le modifiche a b nell'ultimo commit
(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)
git rm --cached
e elimina la danza di backup / restore (-1).
Un'alternativa che non richiede l'hacking dell'indice, ma conserva comunque il vecchio messaggio di commit:
$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}
Mi piace perché (a) usa i comandi che uso regolarmente e (b) posso fare git add -p
per capire esattamente cosa voglio commettere.
... Then stash/delete b, re-commit..
, Qui non dovrebbe il termineThen
essereafter
? ---amend
dopo lo stach / elimina b, ...