✦ Oplossingen · Server- en developerfouten

You are in 'detached HEAD' state: wat betekent het in Git?

Git meldt ‘You are in detached HEAD state’ of ‘HEAD detached at …’? Lees wat het is, hoe je werk bewaart met git switch -c en terugvindt via git reflog.

Zo ziet de foutmelding eruit

  • You are in 'detached HEAD' state.
  • HEAD detached at 1a2b3c4
  • Note: switching to '1a2b3c4'.
  • Warning: you are leaving 1 commit behind, not connected to any of your branches
  • fatal: You are not currently on a branch.

Waarom gebeurt dit?

In Git wijst HEAD normaal naar een branch, zoals main, en die branch wijst naar de nieuwste commit. Maak je een commit, dan schuift de branch mee. In ‘detached HEAD’ wijst HEAD rechtstreeks naar één commit in plaats van naar een branch. Je kunt rondkijken, testen en zelfs committen, maar er hangt geen branchnaam aan je nieuwe commits.

Dat gebeurt als je een specifieke commit, een tag of een remote branch uitcheckt, bijvoorbeeld git checkout 1a2b3c4, git checkout v2.0 of git checkout origin/main. Het is ook normaal tijdens een rebase, in submodules (die staan standaard op een vaste commit) en in veel buildstraten en CI-omgevingen, die precies één commit ophalen.

Op zich is er niets mis. Het risico zit pas in wat je daarna doet: commit je in deze toestand en schakel je daarna naar een andere branch, dan hangen die commits nergens meer aan. Git waarschuwt dan dat je commits ‘achterlaat’. Ze zijn niet direct weg, maar wel lastig terug te vinden, en na verloop van tijd ruimt Git ze op.

Zo herken je dit probleem

  • git status begint met HEAD detached at of HEAD detached from in plaats van On branch main.
  • Je prompt of editor toont een commitnummer (zoals 1a2b3c4) in plaats van een branchnaam.
  • Een git push faalt met ‘You are not currently on a branch’.
  • Zie je dit midden in een rebase met conflicten, los dan eerst het conflict op en ga verder met git rebase --continue: zie merge conflict.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Kijk waar je staat

    Gebruik git status en git log --oneline -5. Zo zie je op welke commit je staat en of je midden in een rebase of merge zit. Staat er ‘rebase in progress’, rond die dan eerst af of breek hem af met git rebase --abort.

    git status
    git log --oneline --graph --all -10
  2. Alleen gekeken? Ga terug naar je branch

    Heb je niets veranderd en wilde je alleen een oude versie bekijken, dan schakel je gewoon terug. git switch bestaat in recente Git-versies; in oudere versies gebruik je git checkout main. Met git switch - ga je terug naar waar je vandaan kwam.

    git switch main
    # of: git switch -
    # oudere Git: git checkout main
  3. Wel gecommit? Maak er eerst een branch van

    Heb je in detached HEAD commits gemaakt die je wilt houden, maak dan een branch op de plek waar je nu staat, voordat je wegschakelt. De commits hangen dan aan die nieuwe branch en zijn veilig. Daarna kun je die branch normaal pushen of samenvoegen met main.

    git switch -c mijn-werk
    # oudere Git: git checkout -b mijn-werk
    git push -u origin mijn-werk
  4. Voeg het werk samen met je hoofdbranch

    Wil je de commits in main hebben, schakel dan naar main en voeg de nieuwe branch samen. Gaat het om één losse commit, dan kun je die ook overnemen met git cherry-pick.

    git switch main
    git merge mijn-werk
    # of één commit:
    git cherry-pick 1a2b3c4
  5. Al weggeschakeld? Zoek de commits in de reflog

    Ben je toch al teruggegaan naar main en mis je je commits, dan staan ze in de reflog: een logboek van waar HEAD de laatste tijd heeft gestaan. Zoek de regel met je commitbericht en maak op dat commitnummer een branch. Git noemt het nummer ook in de waarschuwing ‘you are leaving 1 commit behind’.

    git reflog
    git branch herstel 1a2b3c4
  6. Remote branch bekijken? Maak een lokale branch

    git checkout origin/feature geeft altijd detached HEAD, omdat origin/feature een kopie is van de server en geen eigen branch. Wil je daarop werken, maak dan een lokale branch die hem volgt. Recente Git-versies doen dat automatisch als je git switch feature typt en die branch alleen op de server bestaat.

    git switch feature
    # of expliciet:
    git switch -c feature --track origin/feature
  7. Submodules en CI: meestal geen probleem

    In een submodule of buildomgeving is detached HEAD de bedoelde toestand: er wordt een vaste commit gebruikt. Wil je in een submodule iets wijzigen, schakel daar dan eerst naar een branch voordat je commit, anders raak je die commits makkelijk kwijt.

    cd submodule-map
    git switch main

Let op: Schakel niet weg uit detached HEAD als je daar commits hebt gemaakt die je wilt houden, voordat je er een branch van hebt gemaakt. Ze verdwijnen niet meteen, maar Git ruimt losse commits na verloop van tijd op.

Wanneer schakel je hulp in?

  • Je bent commits kwijt en vindt ze niet terug in git reflog.
  • Je website wordt uitgerold vanuit Git en de server staat op een losse commit in plaats van een branch.
  • Submodules lopen uit de pas met het hoofdproject en updates komen niet meer mee.
  • Je zit midden in een rebase die steeds vastloopt en weet niet of je kunt afbreken.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Is detached HEAD gevaarlijk?

Nee, het is een gewone toestand om oude versies te bekijken. Alleen commits die je in die toestand maakt, moet je aan een branch hangen voordat je wegschakelt.

Hoe kom ik uit detached HEAD?

Met git switch main (of git checkout main) als je niets wilt bewaren, of met git switch -c nieuwe-branch als je je commits wilt houden.

Ik ben mijn commits kwijt na het wegschakelen. Wat nu?

Kijk in git reflog, zoek het commitnummer en maak er een branch van met git branch herstel <nummer>.

Waarom staat mijn CI-build in detached HEAD?

Buildomgevingen halen vaak precies één commit op, zonder branch. Dat is zo bedoeld en geen fout.