2011-11-03 11 views
29

Come si esegue l'equivalente di TFS "Annulla modifiche in sospeso" in Git, su uno o più file?Come eseguire l'equivalente TFS di "Annulla modifiche in sospeso"

Ciò significa sostanzialmente fare questi passi:

  • annullare le modifiche su disco
  • Ripristino eventuali modifiche Git ha scoperto
  • Ottenere le ultime modifiche sul file da Git

E ' sarebbe bello sapere le differenze (se ce ne sono) nei comandi per farlo se hai (1) appena cambiato su disco, senza aggiungerlo, ma anche quando hai (2) fatto il comando add e per un bonus, (3) anche se hai commesso la modifica.

risposta

31

Per 1 e 2, tutto quello che dovete fare è:

git stash -u #same effect as git reset --hard, but can be undone 

questo sarà buttare via tutti i cambiamenti. Stai attento se usi reset. Leggi su come manipolare l'indice e le permutazioni delle opzioni hard, soft e miste con reset e checkout. Il libro progit spiega in dettaglio: http://progit.org/2011/07/11/reset.html

per 3,

git reset --hard HEAD^ 

ma sarebbe meglio emettere un git stash -u prima di questo - nel caso in cui si dispone di modifiche in sospeso.

Ciò ripristinerà il ramo corrente al padre del commit corrente. Cerca "tree-ish" online.^e ~ N dopo un riferimento ti permetteranno di puntare a qualsiasi punto raggiungibile nella cronologia di quel riferimento. Per capire come viene tracciata la cronologia in git, "Git for computer scientists" spiega il pozzo del grafico Acyclic diretto: http://eagain.net/articles/git-for-computer-scientists/

Per ottenere singoli file dallo stato del commit corrente (cioè, eliminare le modifiche), è possibile utilizzare il checkout

git checkout HEAD -- <a list of files> 

Se si è emesso l'ultimo comando di ripristino sopra per errore, non si è nei guai. Git tiene traccia di dove i rami usavano indicare il reflog.

git reflog 

elencherà la cronologia. Si può vedere a che la produzione come fare riferimento a ciascuno, in modo:

git reset --hard [email protected]{1} 

sarà ripristinare il ramo dove è usato per essere 1 cambiamento prima.

Per aggiungere, se si desidera cancellare i file ignorati ei file non monitorate, si può pulire con questo:

git clean -xdf 
+0

Attenzione; git non ti chiederà una bella (irritante?) finestra di dialogo per selezionare i file modificati su cui vuoi annullare le modifiche in sospeso. :) –

+1

un modo per farlo sarebbe quello di aggiungere il parametro -p che ti chiederà ogni singolo blocco di modifiche. Puoi dire 'a' o' d' per lavorare su interi file invece di 'y' o' n' per i singoli hunk. –

4

Questo comando annullare le modifiche locali e ripristinarli alle versioni attuali nel repository:

git reset --hard 

È possibile ripristinare l'ultima valida commit mediante l'emissione di:

git reset --hard HEAD 

I f si vuole solo ripristinare un solo file, uso git checkout invece:

git checkout -- file_name.extension 
git checkout HEAD file_name.extension 
+2

Perché si fa una distinzione tra 'git reset --hard' e' git reset --hard HEAD'? – manojlds

2
  1. git checkout [path] o (intero repo) git reset --hard HEAD
  2. git reset [path] seguito da git checkout [path]
  3. git reset --hard [commit] per ripristinare lo stato del pronti contro termine a [commit], che deve essere un tree-ish
0

Il mio equivalente a TFS undo in Git con Eclipse è semplicemente fare clic con il pulsante destro del mouse sul file e selezionare Replace with ->HEAD Revision (o qualsiasi altra versione desideri).

Problemi correlati