Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent commit in detached HEAD

Why does git allow you to commit to a detached head? Is there any pre commit hook that can disable it? What is the purpose? Many new developers do this and I'd like to find a way to disable it.

like image 873
Ben Avatar asked Jan 06 '23 01:01

Ben


2 Answers

This can be only prevented by a local git pre-commit hook, so developers would need to create it. Add the your-local-project/.git/hooks/pre-commit file with the following contents:

#!/bin/sh

if ! git symbolic-ref HEAD &> /dev/null; then
  echo "You are in a detached head state! Commit has been blocked. (Use --no-verify to bypass this check.)"
  exit 1
fi

Make sure it's executable. Credits go to svachalek

Why should git prevent commiting in detached HEAD? Detached HEAD means only that there is no pointer to the repository state you are working on. It assumes that you know what you are doing.

I would rather investigate why many developers in your team enter this state? Maybe they apply some weird worklow?

like image 182
fracz Avatar answered Jan 16 '23 10:01

fracz


git checkout $commit-sha1 can lead to a detached HEAD. So does git checkout FETCH_HEAD. A detached HEAD could be considered as a branch without a name. If it does not confuse you, you could just ignore it. As @fracz said, you could prevent it by pre-commit. You could also make it a branch with a name with git checkout -b some_name. A post-checkout hook may help you to detect the detached HEAD state and make it a branch.

like image 41
ElpieKay Avatar answered Jan 16 '23 11:01

ElpieKay