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.
Se si commettono dopo il checkout, si avrà un punto di diramazione, non una sovrascrittura. –