Dipende da cosa vuoi fare quando effettui il checkout di quel commit. Se tutto ciò che stai facendo è verificarlo in modo da poter costruire o testare quella revisione, allora non c'è niente di sbagliato nel lavorare con una testa staccata. Ricorda solo di controllare un ramo effettivo prima di effettuare qualsiasi commit ( git checkout master
, ad esempio), in modo da non creare commit che non siano inclusi in alcun ramo.
Se, invece, vuoi fare più commit a partire da quel punto, dovresti creare un branch. Se effettui commit che non sono referenziati da un ramo, possono perdersi facilmente e alla fine verranno ripuliti dal garbage collector di git, poiché nulla si riferisce a loro. Puoi creare un nuovo ramo eseguendo:
git checkout -b newbranch ea3d5ed
Per aiutare a visualizzare, ecco alcuni diagrammi che dimostrano come lavorare su una testa staccata differisce dal lavorare su un ramo.
Iniziamo con 3 commit su master
, A, B e C. master
è il ramo corrente, quindi HEAD
punta a master
, che punta a commit C.
ABC
* - * - * <- master <- HEAD
Ora, se eseguiamo il commit, git creerà un commit che ha C come genitore (perché è il commit corrente, puntato da HEAD
via master
), e si aggiornerà master
per puntare a quel nuovo commit. Tutti i nostri commit sono ora in master
e HEAD
punta al nuovo commit master
.
ABCD
* - * - * - * <- master <- HEAD
Adesso controlliamo B, dandoci un distaccato HEAD
.
ABCD
* - * - * - * <- master
^
\-- CAPO
Tutto funziona bene qui; possiamo guardare tutti i file, costruire il nostro programma, testarlo, ecc. Possiamo anche creare nuovi commit; ma se lo facciamo, non c'è nessun ramo su cui siamo, quindi non possiamo puntare nessun ramo a quel nuovo commit. L'unica cosa che lo indica è HEAD
:
ABCD
* - * - * - * <- master
\
* <- TESTA
E
Se in seguito decidiamo di effettuare master
nuovamente il check-out , non ci sarà nulla che si riferisca a E.
ABCD
* - * - * - * <- master <- HEAD
\
*
E
Dal momento che non c'è nulla che si riferisca ad esso, può essere difficile da trovare e git considera i commit senza riferimenti da abbandonare (accadono abbastanza comunemente se si rebase, si squash patch o si fanno altre manipolazioni della cronologia divertenti; di solito rappresentano patch abbandonate che non ti interessa più). Dopo un certo periodo di tempo, git lo considererà spazzatura, da scartare la prossima volta che viene eseguito il garbage collection.
Quindi, invece di controllare una semplice revisione e ottenere una testa distaccata, se hai la sensazione di fare più commit, dovresti usare git checkout -b branch B
per creare un ramo e controllarlo. Ora i tuoi commit non andranno persi, poiché saranno inclusi in un ramo, a cui puoi facilmente fare riferimento e unire in seguito.
ABCD
* - * - * - * <- master
^
\ - ramo <- TESTA
Se ti dimentichi di farlo e crei commit da un ramo, non devi preoccuparti. È possibile creare un ramo che fa riferimento alla revisione della testina con git checkout -b branch
. Se sei già tornato al master
ramo e ti rendi conto di aver dimenticato un commit vagante, puoi trovarlo usando git reflog
, che ti mostrerà una cronologia di ciò a cui i commit HEAD
hanno puntato negli ultimi giorni. Tutto ciò che è ancora nel reflog non verrà raccolto nella spazzatura e generalmente i riferimenti vengono conservati nel reflog per almeno 30 giorni.