Зазвичай HEAD вказує на гілку, а гілка - на коміт:
cat .git/HEAD
# ref: refs/heads/main
Новий коміт пересуває гілку main, а HEAD іде слідом.
Detached HEAD - HEAD вказує напряму на коміт, оминаючи гілку:
git switch --detach v2.4.0 # чи git checkout v2.4.0, git checkout a1b2c3d
cat .git/HEAD
# 9fceb02d0ae598e95dc970b74767f19372d61af8
Коли це відбувається:
- перехід на тег чи конкретний коміт, щоб подивитися старий стан;
git bisectперемикає коміти саме так;- під час
rebaseз зупинками й розв'язання конфліктів; - CI зазвичай клонує конкретний коміт у detached HEAD;
- підмодулі - завжди на конкретному коміті.
Небезпека: у цьому стані можна комітити, але на нові коміти не вказує жодна гілка. Після перемикання на main вони стають недосяжними:
Warning: you are leaving 2 commits behind, not connected to
any of your branches:
3e1f2a4 Try new cache driver
Через якийсь час (за замовчуванням недосяжні записи reflog живуть 30 днів) git gc їх видалить.
Як зберегти роботу:
# ще в detached HEAD - створити гілку на поточному коміті
git switch -c experiment/cache-driver
# уже перемкнулися - знайти коміт і створити гілку
git reflog
git branch experiment/cache-driver 3e1f2a4
Як помітити стан: git status пише HEAD detached at v2.4.0, а більшість промптів оболонки показують хеш замість назви гілки.
Практичні поради:
- для експериментів зі старою версією одразу створюйте гілку:
git switch -c try-fix v2.4.0; git switchбез--detachне перейде на тег - захист від випадкового detached HEAD;- у скриптах CI, які щось комітять (наприклад, оновлення changelog), явно створюйте чи перемикайте гілку перед комітом, інакше
git pushне матиме що відправити.