Почему git использует две разные команды для отображения HEAD?
Я заметил, что есть 2 HEAD:
- .git\ГОЛОВА
- .git\рефов\перепятнышки\происхождение\ГОЛОВА
Когда я использую git show-ref HEAD
, он только дает мне это:
ce0762c073b407d794f54f0b5d2a50375fdcb609 refs/remotes/origin/HEAD
Когда я использую git rev-parse HEAD
, он дает мне значение .git\HEAD:
a758e523fe40e799194878bac567b7f4b8eec2b9
Почему Git используют две разные команды для отображения HEAD? Любая сильная причина?
Ответы
Ответ 1
git-show-ref
показывает список ссылок в вашем репозитории и их идентификаторы фиксации. Вероятно, его следует назвать git-show-refs
. Он предпочитал напрямую ссылаться на файлы в каталоге .git
.
Когда вы скажете git show-ref HEAD
, вы не просите HEAD
. То, что вы просите, это любые ссылки в списке, которые соответствуют шаблону HEAD
. HEAD
сам обычно отфильтровывается, поэтому вы получаете refs/remotes/origin/HEAD
. Вы можете включить HEAD
с помощью --head
.
$ git show-ref --head HEAD
f37beeea95f3b0e6b064f6d4b5f835a058e0568c HEAD
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20 refs/remotes/origin/HEAD
Поэтому вы не должны использовать git show-ref <ref>
для поиска ссылок.
git-rev-parse
принимает параметр ревизии и возвращает идентификатор фиксации. Это означает иметь дело с множеством разных способов, которыми вы можете ссылаться на фиксацию. Например...
$ git rev-parse --verify master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20
$ git rev-parse --verify heads/master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20
$ git rev-parse --verify refs/heads/master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20
git rev-parse --verify <ref>
- это то, что вы должны использовать для поиска идентификатора фиксации ссылки.
Ответ 2
.git/HEAD
используется Git для хранения текущего ref. Поэтому, когда вы находитесь на master
, это будет ref: refs/heads/master
. Когда вы находитесь на detached HEAD
, это будет хеш-фиксация.
.git/refs/remotes/origin/HEAD
на самом деле является удаленным ref, который указывает на ветвь по умолчанию на удаленном компьютере. Когда master является удаленной ветвью по умолчанию, это будет ref: refs/remotes/origin/master
(если ваш пульт - это источник). Возможно иметь удаленную ветвь по умолчанию, отличную от master
, но я заметил, что она не будет правильно отражать это.
Но
$ git remote show github
всегда укажет правильную удаленную ветку по умолчанию.
Подробнее см. этот ответ Как установить источник /HEAD?.
git show-ref
показывает вам ссылки, которые являются локальными ветвями, удаленными ветвями, тегами, сообщениями с привязкой.
С
git show-ref HEAD
Git использует "HEAD" как шаблон
git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference]
[-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags]
[--heads] [--] [<pattern>…]
и отображаются только те ссылки, которые соответствуют.
См. git -show-ref doc.
В основном я использую git branch
с параметрами -a
или -r
, чтобы видеть ветки, git tag
, чтобы видеть теги, и редко использовать git show-ref
.