Come funziona effettivamente Git Reset? Spiegazione dei reset soft, hard e misti

0
436

git reset è un potente comando che può modificare la cronologia del tuo repository Git e correggere gli errori che hai commesso. Tuttavia, anche se il nome fa sembrare spaventoso da usare, in realtà è piuttosto semplice, quindi parliamo di come funziona.

Cos'è Git HEAD?

Prima di capire come funzionano i reset, dobbiamo parlare di Git HEAD.

“HEAD” è semplicemente un alias per il tuo attuale commit di lavoro. Puoi pensarlo come la testa di un giradischi, dove la sua posizione determina quali dati vengono utilizzati. Se stai attualmente utilizzando il ramo master, HEAD sarà l'ultimo commit in quel ramo.

Nonostante sia un alias per un commit, HEAD in realtà non punta direttamente a un commit per la maggior parte del tempo. Punta verso un ramo e utilizza automaticamente l'ultimo commit. Può anche puntare direttamente a un commit, noto come “intestazione distaccata,” anche se questo non ha importanza per git reset.

Come funziona Git Reset?

La cronologia dei commit di Git è memorizzata come un albero di commit, ed è pensata per essere immutabile per la maggior parte. Tuttavia, a volte è necessario modificare questa cronologia, ed è qui che entra in gioco git reset.

Annuncio

Ogni commit si collega al commit precedente e può ramificarsi in rami diversi che alla fine verranno rifusi nel ramo principale. In entrambi i casi, l'HEAD di solito punta all'ultimo commit in qualsiasi ramo su cui stai lavorando.

Quindi cosa succede quando fai un commit che vuoi ripristinare?

Beh, l'esecuzione di git reset in pratica sposta indietro l'HEAD e lascia in sospeso tutti i commit davanti. Questo riscrive la cronologia di Git solitamente immutabile per eliminare i commit davanti all'HEAD.

Questo può essere molto utile per molte ragioni. Forse hai fatto un commit, poi hai apportato alcune modifiche aggiuntive e volevi spingere l'intera cosa come un commit. Potresti ripristinare il commit precedente e quindi eseguire nuovamente il commit correttamente.

O forse hai accidentalmente eseguito un commit che includeva alcune modifiche che non volevi tenere traccia. Questo può essere molto difficile da capire se non sai come funziona git reset, ma reimpostando l'HEAD e quindi solo la messa in scena delle modifiche corrette otterrai questo risultato. Nota che questo è diverso da git revert, che inverte i commit.

RELAZIONATO: Come recuperare i commit ripristinati in un repository Git

Ci sono tre diversi tipi di reset in Git e differiscono tutti in base a come gestiscono i commit che vengono lasciati in sospeso. Tutti riscrivono la cronologia di Git e tutti spostano indietro l'HEAD, ma gestiscono le modifiche in modo diverso:

  • git reset –soft, che manterrà i tuoi file e metterà in scena tutte le modifiche automaticamente .
  • git reset –hard, che distruggerà completamente tutte le modifiche e le rimuoverà dalla directory locale. Usalo solo se sai cosa stai facendo.
  • git reset –mixed, che è l'impostazione predefinita e mantiene tutti i file uguali ma annulla le modifiche. Questa è l'opzione più flessibile, ma nonostante il nome, non modifica i file.

Pubblicità

La differenza tra soft e mixed è se i cambiamenti sono organizzati o meno. Staged è fondamentalmente una zona intermedia tra la directory locale e la cronologia di Git. git add stage file e git commit li scrive nella cronologia. In entrambi i casi, la directory locale non è interessata, cambia solo lo stato del tracciamento di Git di tali modifiche.

Fondamentalmente, i reset Soft e Mixed sono per lo più gli stessi e ti consentono di mantenere le modifiche, e gli Hard reset riporteranno completamente la tua directory locale al punto in cui si trovava in quel momento del commit.

Uso di Git Reset

Una volta capito cosa sta succedendo, utilizzare effettivamente git reset è incredibilmente facile. Per ripristinare, avrai bisogno di un riferimento al commit a cui vuoi tornare. Puoi ottenerlo eseguendo reflog:

git reflog

Copia il codice a sette cifre a destra. Se sei appena rimasto bloccato in vim, premi Q e magari esegui git config –global core.editor “nano”.

Quindi, puoi ripristinare il commit di destinazione:

git reset –misto a560612

Oppure puoi scegliere come target i commit in base alla loro posizione rispetto all'HEAD. Il seguente comando mira al commit subito prima dell'HEAD, che è una scorciatoia utile se devi reimpostare l'ultimo commit:

git reset –mixed HEAD~

Se stai usando un client Git come Fork , il ripristino è facile come fare clic con il pulsante destro del mouse sul commit di destinazione e selezionare “Reset”:

Dovresti mai eseguire un hard reset?

Dovresti davvero usare solo soft reset o reset misti, ma, se hai incasinato il tuo repository così tanto che devi resettarlo completamente, puoi usare la seguente sequenza di comandi per riportarlo completamente alla normalità.

git fetch origin git checkout master git reset –hard origin/master git clean -d –force Advertisement

Naturalmente, puoi sempre estrarre il classico “cancella il tuo repository e clona nuovamente da Github,” ma in questo modo è almeno approvato da Git e ripristina solo un singolo ramo.