Risposte:
Questi tre comandi hanno scopi completamente diversi. Non sono nemmeno lontanamente simili.
git revert
Questo 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 checkout
Questo 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 reset
Questo 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 checkout
per 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 reset
per 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 reset
e git checkout
può 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 --hard
e 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 reset
dice a Git di spostare HEAD su un altro commit. git checkout
d'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 B
dipendono dalle modifiche in A
, il ripristino di A
non è 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 A
completamente.
git revert
viene 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 --soft
ripristina solo HEAD, git reset --hard
ripristina 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 reset
e 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