Qualsiasi checkout di un commit che non è il nome di uno dei tuoi rami ti farà ottenere un HEAD distaccato. Un SHA1 che rappresenta la punta di un ramo fornisce ancora una TESTA staccata. Solo una verifica di un nome di filiale locale evita quella modalità.
Vedi impegno con una TESTA staccata
Quando HEAD è staccato, il commit funziona normalmente, tranne per il fatto che nessun ramo con nome viene aggiornato. (Puoi pensarlo come un ramo anonimo.)
Ad esempio, se fai il checkout di un "ramo remoto" senza prima rintracciarlo, puoi finire con un HEAD staccato.
Vedi git: cambia ramo senza staccare la testa
Con Git 2.23 (agosto 2019), non è più necessario utilizzare il comando confusogit checkout
.
git switch
può anche effettuare il checkout di un ramo e ottenere un distacco HEAD, tranne:
- ha
--detach
un'opzione esplicita
Per verificare il commit HEAD~3
per ispezione temporanea o esperimento senza creare una nuova filiale:
git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
- non può essere staccato per errore da un ramo di tracciamento remoto
Vedere:
C:\Users\vonc\arepo>git checkout origin/master
Note: switching to 'origin/master'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
Vs. usando il nuovo git switch
comando:
C:\Users\vonc\arepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'
Se si desidera creare un nuovo ramo locale tenendo traccia di un ramo remoto:
git switch <branch>
Se <branch>
non viene trovato ma esiste un ramo di tracciamento esattamente in un telecomando (chiamalo <remote>
) con un nome corrispondente, trattalo come equivalente
git switch -c <branch> --track <remote>/<branch>
Niente più errore!
Niente più TESTE staccate indesiderate!
branch-name@{n}
, l'ennesima posizione precedente dibranch-name
. Ma non importa quale, a un certo punto ci deve essere stato ungit checkout <rev>
. Se questo non suona un campanello, allora probabilmente hai fatto quello che Will ha menzionato: hai provato a faregit checkout <file>
e sei riuscito a specificare una revisione per caso.