2015-08-26 46 views
6

Diciamo che voglio annullare tutte le modifiche introdotte dai commit precedenti.Differenza tra git reset --hard e git checkout

Per quanto ho capito, git reset --hard <specified commit> rimuoverà tutti i commit fino al commit specificato e annullerà tutte le modifiche.
D'altra parte git checkout <specified commit> cambierà la mia directory per riflettere il commit specificato.

Quindi se I git reset dopo il git checkout avrà lo stesso risultato di git reset --hard?

In alternativa, se ho semplicemente dopo il git checkout, il commit appena creato sovrascrive i commit esistenti?

+0

Se si commettono dopo il checkout, si avrà un punto di diramazione, non una sovrascrittura. –

risposta

4

In breve, git commits sono un albero e i rami sono solo indicatori di alcuni commit.

git checkout <specified commit> non sposta il puntatore del ramo. Quando lo fai, sei nello stato di testa staccata. Verrà visualizzato questo messaggio, che è piuttosto auto-esplicativo:

Si è nello stato di 'TESTATA distaccata'. Puoi guardarti intorno, fare le modifiche sperimentali a e commetterle, e puoi scartare qualsiasi commit effettuato in questo stato senza impattare alcun ramo eseguendo un altro checkout a .

Se si desidera creare un nuovo ramo per conservare i commit creati, è possibile eseguire (ora o più tardi) utilizzando -b con il comando checkout di nuovo. Esempio:

git checkout -b new_branch_name

Un'altra differenza è che git checkout è più sicuro, perché non rifiuterà le modifiche nella struttura di lavoro, e non si perde alcun commit con it¹.

git reset --hard <specified commit>, d'altra parte, sposta il ramo corrente sul commit specificato e perderete tutte le modifiche nell'albero di lavoro. Inoltre, se ti stai trasferendo ad un commit più vecchio e i nuovi commit non sono in qualche altro ramo, perderai anche questi nuovi commit. Non è un'operazione sicura e non farlo a meno che tu non capisca davvero cosa stai facendo.

Vedere anche these great answers per informazioni su come annullare un commit git.

Potresti anche trarre vantaggio dall'utilizzo di uno strumento GUI come SourceTree.


¹ - bene, a meno che non siete già in stato di testa indipendente su alcuni penzoloni impegnarsi, ma di solito non si deve preoccuparsi.

3

Quindi, se ho git reset dopo git checkout Avrà lo stesso risultato di git reset --hard?

No.git reset (con --hard, o qualsiasi altra opzione) reimposta l'HEAD, quindi perdi sempre i commit, a meno che tu non stia specificando alcun commit su cui eseguire il reset.

Dopo aver eseguito il comando git checkout <commit>, ci si trova in uno stato HEAD distaccato, quindi git reset è un po 'inutile perché non si ripristinerà alcun ramo.

In alternativa, se ho semplicemente git commit dopo git checkout, sarà la nuova creazione commettere sovrascrivere i commit esistenti?

No. Perché di nuovo, si è in uno stato di TESTA distaccato. Stai essenzialmente creando commit in un ramo fantasma.

La cosa più sicura è creare sempre un nuovo ramo con git checkout -b e una volta che si è sicuri di voler resettare l'altro ramo, eseguire git reset --hard.