Risposte:
Questi tre comandi hanno scopi completamente diversi. Non sono nemmeno lontanamente simili.
git revertQuesto comando crea un nuovo commit che annulla le modifiche rispetto a un commit precedente. Questo comando aggiunge una nuova cronologia al progetto (non modifica la cronologia esistente).
git checkoutQuesto comando estrae il contenuto dal repository e lo inserisce nell'albero di lavoro. Può anche avere altri effetti, a seconda di come è stato invocato il comando. Ad esempio, può anche cambiare il ramo su cui stai lavorando. Questo comando non apporta alcuna modifica alla cronologia.
git resetQuesto comando è un po 'più complicato. In realtà fa un paio di cose diverse a seconda di come viene invocato. Modifica l'indice (la cosiddetta "area di gestione temporanea"). Oppure cambia il tipo di commit a cui punta attualmente una diramazione. Questo comando può modificare la cronologia esistente (modificando il commit a cui fa riferimento un ramo).
Se un commit è stato fatto da qualche parte nella storia del progetto e in seguito decidi che il commit è sbagliato e non avrebbe dovuto essere fatto, allora git revertè lo strumento per il lavoro. Annullerà le modifiche introdotte dal commit errato, registrando "annulla" nella cronologia.
Se hai modificato un file nella tua struttura di lavoro, ma non hai eseguito il commit della modifica, puoi utilizzare git checkoutper estrarre una copia del file dal repository.
Se hai effettuato un commit, ma non lo hai condiviso con nessun altro e decidi di non volerlo, puoi utilizzare git resetper riscrivere la cronologia in modo che sembri non averlo mai fatto.
Questi sono solo alcuni dei possibili scenari di utilizzo. Esistono altri comandi che possono essere utili in alcune situazioni e anche i tre comandi precedenti hanno altri usi.
git resete git checkoutpuò fare esattamente la stessa cosa. Dire che "non sono nemmeno lontanamente simili" non è solo un'esagerazione eccessiva: non è nemmeno lontanamente vero. Questi due comandi possono fare molte cose diverse, alcune delle quali si sovrappongono completamente. Esempio: git reset --harde git checkout -- .farà esattamente la stessa cosa. E logicamente parlando, git reset --hard <path>e git checkout <path>dovrebbe anche fare la stessa identica cosa - git comunque ti impedisce di farlo. Confondere questi due comandi è MOLTO facile.
git reset --hard <path>come puoi git checkout <path>proprio perché i due comandi fanno qualcosa di completamente diverso. git resetdice a Git di spostare HEAD su un altro commit. git checkoutd'altra parte non chiede a Git di fare nulla con HEAD. Lascia solo HEAD e controlla semplicemente un file. Sì, puoi fabbricarli in modo tale da avere effetti simili. Ma quello che fanno in realtà è totalmente diverso.
Supponiamo che tu abbia commesso:
C
B
A
git revert B, creerà un commit che annulla le modifiche in B.
git revert A, creerà un commit che annulla le modifiche in A, ma non tocca le modifiche inB
Notare che se le modifiche in Bdipendono dalle modifiche in A, il ripristino di Anon è possibile.
git reset --soft A, modificherà la cronologia e il repository di commit; la directory di gestione temporanea e di lavoro sarà ancora allo stato di C.
git reset --mixed A, modificherà la cronologia di commit, il repository e la gestione temporanea; directory di lavoro sarà ancora allo stato di C.
git reset --hard A, modificherà la cronologia di commit, il repository, la directory di gestione temporanea e di lavoro; tornerai allo stato di Acompletamente.
git revertviene utilizzato per annullare un commit precedente. In git, non è possibile modificare o cancellare un commit precedente. (In realtà puoi, ma può causare problemi.) Quindi, invece di modificare il commit precedente, ripristina introduce un nuovo commit che inverte uno precedente.git reset viene utilizzato per annullare le modifiche nella directory di lavoro che non sono state ancora modificate.git checkoutè usato per copiare un file da qualche altro commit nel tuo attuale albero di lavoro. Non commette automaticamente il file.git reset --softripristina solo HEAD, git reset --hardripristina HEAD e la directory di lavoro.
git checkout modifica il tuo albero di lavoro,git reset modifica a quale riferimento fa riferimento il ramo su cui ti trovi,git revert aggiunge un commit annullando le modifiche.git reset non modifica solo il commit a cui punta un ramo , ma viene anche utilizzato per rimuovere i file dall'indice e può modificare la copia di lavoro con git reset --mixed(impostazione predefinita).
Ripristina - a livello di commit, il ripristino è un modo per spostare la punta di un ramo su un altro commit. Questo può essere usato per rimuovere commit dal ramo corrente.
Ripristina: il ripristino annulla un commit creando un nuovo commit. Questo è un modo sicuro per annullare le modifiche, in quanto non ha alcuna possibilità di riscrivere la cronologia di commit. Contrastalo con git reset, che altera la cronologia di commit esistente. Per questo motivo, git revert dovrebbe essere usato per annullare le modifiche su un ramo pubblico e git reset dovrebbe essere riservato per annullare le modifiche su un ramo privato.
Puoi dare un'occhiata a questo link: Reimposta, Acquista e Ripristina
Se hai rotto l'albero ma non hai eseguito il commit del codice, puoi usarlo git resete se vuoi solo ripristinare un file, puoi usare git checkout.
Se hai rotto l'albero e impegnato il codice, puoi usare git revert HEAD.
http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html