Qual è la differenza tra Git Revert, Checkout e Reset?


274

Sto cercando di imparare come ripristinare o file e progetti di rollback a uno stato precedente, e non capiscono la differenza tra git revert, checkoute reset. Perché ci sono 3 comandi diversi per lo stesso apparente scopo e quando qualcuno dovrebbe sceglierne uno rispetto all'altro?

Risposte:


461

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).

Usando questi comandi

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.


13
Quindi i tre comandi possono essere usati per ANNULLARE un po 'di lavoro, il che significa che non sono così "completamente diversi". Stesso concetto, contesti diversi.
Bruno Santos,

16
@BrunoSantos: candelieri, tubi di piombo, pugnali e corda possono tutti essere usati per uccidere le persone, ma ciò non significa che nessuna di queste cose sia particolarmente simile.
Dan Molding,

12
@Dan Mounlding - In realtà, ci sono molti casi in cui 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.
DanGordon,

5
@DanGordon Mi rendo conto che probabilmente avremo solo una differenza di opinione qui. Tuttavia, ritengo che dovrei fornire alcune spiegazioni. Non puoi fare 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.
Dan Molding

46

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.


1
Risposta così intuitiva ... che ne dici di checkout
MJ Studio

29
  • 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.

7
Credo che ti sbagli su "git reset". "git reset" reimposta HEAD su uno dei precedenti commit, non reimposta la directory di lavoro. La directory di lavoro è "ripristinata" da "git checkout [nome file]"
luigi7up

11
git reset --softripristina solo HEAD, git reset --hardripristina HEAD e la directory di lavoro.
Ehryk,

git reset --mix (impostazione predefinita): decomprimere + modifiche sul
palco

21
  • 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.

4
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).

git reset --soft: cambia le modifiche, le modifiche vengono lasciate in scena (indice). git reset - mix (impostazione predefinita): decomprimere + modifiche di scena, le modifiche vengono lasciate nell'albero di lavoro. git reset --hard: uncommit + unstage + elimina le modifiche, nulla è rimasto.
NattyC,

6

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


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.