HEAD - это указатель на текущий коммит.
HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.
Обычно HEAD указывает на имя ветки (например, bugFix). Когда вы делаете коммит, статус ветки bugFix меняется и это изменение видно через HEAD.
Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту.
git checkout fa012b
Переход на коммит предка (на коммит назад)
git checkout master^
git checkout HEAD^
Переход на n-шагов назад
git checkout HEAD~4
Т.к. ветка явялется лишь указателем на коммит (с историей коммитов), ее можно перенести на др. коммит:
git branch -f master HEAD~3
В данном примере преместить ветку мастре на три шага назад от HEAD.
git reset
git reset
отменяет изменения, перенося ссылку на ветку назад, на более старый коммит.
Это своего рода "переписывание истории";
git reset
перенесёт ветку назад, как будто некоторых коммитов вовсе и не было.
git reset HEAD~1
Reset отлично работает на локальных ветках, в локальных репозиториях. Но этот метод переписывания истории не сработает на удалённых ветках, которые используют другие пользователи.
Чтобы отменить изменения и поделиться отменёнными изменениями с остальными, надо использовать git revert.
git revert
В отличие от reset, revert создает новый коммит с прошлыми изменениями.
git revert HEAD