В этих ответах есть, возможно, тонкое, но важное заблуждение. Я решил добавить свой ответ, чтобы прояснить ситуацию.
Что такое HEAD
?
ГОЛОВА ТЫ
HEAD
- это символическая ссылка, указывающая на то, где вы находитесь в истории коммитов. Он следует за вами, куда бы вы ни пошли, что бы вы ни делали, как тень. Если вы сделаете коммит, HEAD
переместится. Если вы что-то оформите, HEAD
переместится. Что бы вы ни делали, если вы переместились куда-то в свою историю изменений, HEAD
переместился вместе с вами. Чтобы устранить одно распространенное заблуждение: вы не можете оторваться от HEAD
. Это не то, что состояние отделенного HEAD. Если вы когда-нибудь обнаружите, что думаете: «О, нет, я нахожусь в отдельном состоянии ГОЛОВА! Я потерял свою ГОЛОВУ!» Помните, это ваша голова. ГОЛОВА это ты. Вы не отсоединились от ГОЛОВКИ, вы и ваша ГОЛОВА отошли от чего-то другого.
К чему может присоединиться HEAD?
HEAD
может указывать на коммит, да, но обычно это не так. Позвольте мне сказать это снова. Обычно HEAD
не указывает на фиксацию. Указывает на ссылку ветвления. Он прикреплен к этой ветви, и когда вы делаете определенные вещи (например, commit
или reset
), присоединенная ветвь будет двигаться вместе с HEAD
. Вы можете увидеть, на что он указывает, заглянув под капот.
cat .git/HEAD
Обычно вы получите что-то вроде этого:
ref: refs/heads/master
Иногда вы получите что-то вроде этого:
a3c485d9688e3c6bc14b06ca1529f0e78edd3f86
Вот что происходит, когда HEAD
указывает непосредственно на коммит. Это называется отделенным HEAD, потому что HEAD
указывает на что-то, кроме ссылки на ветку. Если вы делаете коммит в этом состоянии, master
, больше не привязанный к HEAD
, больше не будет двигаться вместе с вами. Неважно, где находится этот коммит. Возможно, вы находитесь в том же коммите, что и ваша основная ветвь, но если HEAD
указывает на коммит, а не на ветку, он отсоединяется, и новый коммит не будет связан со ссылкой на ветвь. 1046 *
Вы можете посмотреть на это графически, если попытаетесь выполнить следующее упражнение. Запустите это из репозитория git. Вы получите что-то немного другое, но они будут иметь ключевое значение. Когда пришло время извлекать коммит напрямую, просто используйте любой сокращенный хеш, полученный в первом выводе (здесь это a3c485d
).
git checkout master
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD -> master)
git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD, master)
ОК, здесь небольшая разница в выводе. Проверка коммита напрямую (вместо ветки) дает нам запятую вместо стрелки. Как вы думаете, мы находимся в отдельном состоянии головы? HEAD все еще ссылается на конкретную ревизию, связанную с именем ветви. Мы все еще на главной ветке, не так ли?
Теперь попробуйте:
git status
# HEAD detached at a3c485d
Неа. Мы находимся в состоянии «отсоединенная ГОЛОВА».
Вы можете увидеть то же представление (HEAD -> branch)
против (HEAD, branch)
с git log -1
.
В заключение
HEAD
это вы. Это указывает на то, что вы проверили, где бы вы ни находились. Обычно это не коммит, а ветка. Если HEAD
действительно указывает на коммит (или тег), даже если это тот же коммит (или тег), на который указывает ветка, вы (и HEAD
) были отсоединены от этой ветви , Поскольку к вам не прикреплена ветка, ветка не будет следовать за вами, когда вы делаете новые коммиты. HEAD
, однако, будет.