Come ripristinare le modifiche non impegnate, inclusi file e cartelle?


1072

Esiste un comando git per ripristinare tutte le modifiche senza commit in un albero di lavoro e indicizzare e rimuovere anche i file e le cartelle appena creati?



1
Bene, ho letto tutte le risposte varie e difficili da ricordare di seguito, con i loro avvertimenti e casi limite e "non ha funzionato se hai xxx", e mi sono bloccato con l'eliminazione dell'intero repository, clonandolo per rimuovere tutti i file modificati e aggiunti . È anche solo due comandi. rm -r projectdir; git clone xxx. Per me questa è un'operazione frequente: dai un'occhiata a un repository che ci gioca, quindi voglio tornare a un checkout pulito in modo da poter iniziare a modificarlo. Non eccezionale, ma funziona al 100%. Sperando un giorno aggiungeranno un semplice comando per questo.
John Little,

Risposte:


1771

È possibile eseguire questi due comandi:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
buona idea eseguire 'git clean -nd' per visualizzare in anteprima le modifiche prima di eseguire git clean per assicurarsi di non avere file o directory non tracciati che ti interessano che verranno rimossi.
jpw,

80
Salva qualcuno un viaggio nei documenti: -f è la forza, -d è rimuovere le directory, -n è la corsa a secco (anche --dry-run; mostra l'output senza fare ancora nulla)
Aaron Campbell

12
git clean -iper una modalità interattiva.
galath,

Non ha ripristinato i miei file non messi in scena, prima dovevo metterli in scena.
Aron Lorincz,

4
@IgorGanapolsky Probabilmente sei nel mezzo del conflitto di unione. Prova a correre git merge --abort.
htanata,

555

Se si desidera ripristinare le modifiche solo nella directory di lavoro corrente, utilizzare

git checkout -- .

E prima ancora, puoi elencare i file che verranno ripristinati senza fare alcuna azione, solo per verificare cosa accadrà, con:

git checkout --

1
Quando provo questo ottengo "errore: pathspec '.' non corrisponde ad alcun file noto a Git.
Mike K,

34
qual è la differenza tra questo e git reset --hard?
Felipe Almeida,

104
'git reset --hard' annulla le modifiche sia in scena che non in scena, mentre 'git checkout -.' annullerà solo le modifiche non
messe in

Ma se usi il checkout e hai modificato i file, il cmd restituirà che ho bisogno di fare l'unione, anche quando ho solo bisogno di ripristinare queste modifiche
Vinicius Monteiro,

7
git checkout - elencherà semplicemente i file che verranno ripristinati (nessuna azione, solo un elenco). questo è utile se vuoi vedere quali file saranno interessati prima di fare git checkout -.
Krish Srinivasan,

107

Utilizzare "git checkout - ..." per annullare le modifiche nella directory di lavoro

git checkout -- app/views/posts/index.html.erb

o

git checkout -- *

rimuove tutte le modifiche apportate ai file non in scena nello stato git ad es

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *non funziona per me se non mi trovo nella directory in cui si trovano i file modificati. Per effettuare il checkout di tutti i file in tutto il repository, è necessariogit checkout -- :/
waldyrious

In git checkout -- *, la stella viene sostituita da Shell, con tutti i file e le directory nella directory corrente. Quindi dovrebbe andare nelle sottodirectory. Per me funziona. Ma grazie per evidenziare la sintassi ": /" che secondo me è più pulita.
mcoolive,

53

Un modo non banale è eseguire questi due comandi:

  1. git stash Questo sposterà le tue modifiche allo stash, riportandoti allo stato di HEAD
  2. git stash drop Questo eliminerà l'ultima scorta creata nell'ultimo comando.

3
Questo non funziona per le modifiche senza commit, ma solo per le modifiche impegnate.
b0xxed1n,

4
L'ho usato per modifiche senza commit e funziona.
Paul D. Eden,

7
@ b0xxed1n Lo stashing riguarda solo le modifiche senza commit e ovviamente funziona per loro.
TJ

git stash è stato creato per salvare le modifiche non impegnate in modo che tu potessi ... salvarle senza impegnarti.
Rob

git stash provoca il seguente errore:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky,

19
git clean -fd

non ha aiutato, sono rimasti nuovi file. Quello che ho fatto è stato cancellare completamente tutto l'albero di lavoro e poi

git reset --hard

Vedi " Come posso cancellare la mia directory di lavoro locale in git? " Per consigli su come aggiungere l' -xopzione per pulire:

git clean -fdx

Nota -x flag rimuoverà tutti i file ignorati da Git quindi fai attenzione (vedi discussione nella risposta a cui mi riferisco).


che cos'è -fdx? "force, directory e x è?
Adi Prasetyo,

@AdiPrasetyo -x flag rimuove anche tutti i file ignorati; potrebbe essere un effetto indesiderato, quindi ho aggiornato la mia risposta.
Fr0sT

Non riesco ancora a riformulare. Ottengo l'errore: errore: impossibile unire le modifiche. Patch non riuscita a 0003 Crea richiamo a La copia della patch non riuscita si trova in:
IgorGanapolsky

13

Penso che tu possa usare il seguente comando: git reset --hard


hhmm ... l'ho fatto ma i miei file sono ancora lì. Dovrei fare qualcosa dopo?
MEM

1
git reset ripristina solo le modifiche non confermate nell'albero di lavoro. Non rimuoverà i nuovi file e cartelle. Non sono sicuro di come farlo con
Git

1
Quindi, se cambiamo una directory di sistema aggiungendo nuovi file e cartelle e quindi vogliamo riportare quella directory ad uno stato precedente (senza quei file e cartelle), non possiamo farlo con git? Quindi il meglio che possiamo è ripristinare gli stati dei file? Ma una volta creato un file, non possiamo rimuoverlo se non lo facciamo manualmente?
MEM

6

Nota che potrebbero esserci ancora dei file che non sembrano scomparire: potrebbero non essere modificati, ma git potrebbe averli contrassegnati come modificati a causa delle modifiche CRLF / LF. Vedi se hai apportato alcune modifiche di .gitattributesrecente.

Nel mio caso ho aggiunto le impostazioni CRLF al .gitattributesfile e tutti i file sono rimasti nell'elenco "file modificati" per questo motivo. La modifica delle impostazioni di .gitattributes le ha fatte scomparire.


6

Se hai una modifica non impegnata (è solo nella tua copia di lavoro) che desideri ripristinare alla copia nell'ultimo commit, procedi come segue:

git checkout filename

Sto provando questo dopo un commit git rm filename, e non funziona. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

La soluzione per l'annullamento git rmègit checkout master -- filename
falsePockets

3

Git 2.23 ha introdotto il git restorecomando per ripristinare i file dell'albero di lavoro.

https://git-scm.com/docs/git-restore

Per ripristinare tutti i file nella directory corrente

ripristino git.

Se vuoi ripristinare tutti i file sorgente C in modo che corrispondano alla versione dell'indice, puoi farlo

git restore '* .c'


1
è git 2.23 , non 2.13
phuclv,

2

Puoi semplicemente usare il seguente comando git che può ripristinare tutte le modifiche non confermate apportate nel tuo repository:

git checkout .

Esempio:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

Di solito uso questo modo che funziona bene:

mv fold/file /tmp
git checkout fold/file

Questo è esattamente lo stesso proposto dal ragazzo con 357 "Mi piace". Solo che crei persino un backup del file appena estratto.
Matthias,

-3

Un modo sicuro e lungo:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

Uso:

git reset HEAD filepath

Per esempio:

git reset HEAD om211/src/META-INF/persistence.xml
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.